作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] 让两颗LED用不同的频率闪烁
时间Fri Aug 4 11:33:24 2017
开发平台(Platform):C language in embedded system
问题(Question):想让两颗LED用不同的频率闪烁
程式码(Code):
void task1(void)
{
J11: LED1 ON
J12: Delay 1s
J13: LED1 OFF
J14: Delay 1s
}
void task2(void)
{
J21: LED2 ON
J22: Delay 2s
J23: LED2 OFF
J24: Delay 2s
}
补充说明(Supplement):目前的想法是想用中断达到此功能,先执行J11,中断触发执行
J21,中断执行完毕再回去执行J12,中断又触发在执行J22....以此类推。看似很简单的功
能,但要写程式时却不知道如何下手。
问题1: 第一个中断触发後,要怎麽样让中断副程式进入task2这个function?
问题2: 进入task2这个function後,如何让中断副程式"只"做一行後就结束?
问题3: 第二个中断触发後,如何让第二个中断从第一个中断结束的地方继续做?
问题4: 如3,第二个中断结束後,要如何返回J12,而不是重新从J11开始执行?
问题5: 这些功能是不是可以只靠"中断+if else"就达到?最多再多一个timer
问题6: 我该如何思考问题?虽然我现在有办法把问题列出来(并不完全),但最重要的是,
我要如何"思考"这些问题?
谢谢各位前辈的指点与指教,小弟感激不尽。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.12.229.143
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1501817606.A.492.html
1F:→ Killercat: 我虽然不知道你是拿啥语言实作这个,不过组语的做法是 08/04 11:38
2F:→ Killercat: 存现在位置进reg, 跳过去,然後读现在位置+1跳回来 08/04 11:39
3F:→ Killercat: 可以参考C的setjmp()跟longjmp() 分别对应我刚说的功能 08/04 11:40
4F:→ Killercat: 抱歉 不是存位置近reg 是存进heap XD 08/04 11:40
抱歉,忘记补充我是在Embedded system的环境下执行,想用C语言实现,我没看过setjmp
跟longjmp,等等来上网google看看。另外,heap是动态储存区间吧? Embedded system没
有这种东西XD
※ 编辑: zzss2003 (101.12.229.143), 08/04/2017 11:48:43
5F:→ Killercat: 没heap就进reg 缺点就是少了一个reg 很不方便 (? 08/04 12:03
6F:→ Killercat: 不过setjmp本身不知道做得到做不到存reg 08/04 12:03
7F:→ MOONY135: 两个timer不就好了吗 08/04 12:26
请问用两个Timer怎麽达到?
8F:推 JFLung9536: 是在mcu上写吗 08/04 12:47
是
10F:→ james732: 如果不能加counter的话就要想一下 08/04 12:58
这样子LED1或LED2在OFF的时候,会卡在回圈吧?我是打算让LED1在OFF的时候,瞬间切换到
task2
11F:→ descent: while(1){task1();task2()} 不就有你要的效果了。 08/04 13:05
不行,这样子的状况就会变成,LED1亮 -> 一秒後LED1暗 -> LED2亮 -> 两秒後LED2暗
※ 编辑: zzss2003 (101.12.229.143), 08/04/2017 13:23:21
12F:→ james732: 为什麽一定要做成两个task? 08/04 13:38
因为我想要达到real-time的功能
※ 编辑: zzss2003 (101.12.229.143), 08/04/2017 13:41:53
13F:→ MOONY135: 一个TIMER控一个灯阿 08/04 14:25
14F:推 kwpn: 用coroutine 08/04 21:13
15F:推 Lipraxde: 你看看有没有PWM周边阿,有的话就用PWM做啊~ 08/04 21:39
16F:→ cs8425: 自推一下很久之前的RGB LED函式库: 08/07 20:54