作者IOP14759 (iop14759)
看板Electronics
标题[问题] 请问指令周期比if.else小的写法
时间Wed Nov 22 19:40:33 2017
正在练习一个RGB LED IC
他是用24个BIT控制RGB,每个颜色8个BIT
送完24个BIT後LOW超过10uS就会RESET
我现在用的MCU震荡晶体直接换成20Mhz(无法再大)
但是在写CODE控制LED的时候面临到用if.else+CALL副程式下去会接近10uS
https://imgur.com/a/gN1VM
如图,我写的简单的跑马灯
这样子写完去量每个灯之间相距约10uS所以有时候跑马灯跑一跑会RESET造成灯乱亮
像do.while要先执行一次,感觉不行
然後switch我查书本都是要填字,好像不能直接用变数去读
当然我也可以写成
https://imgur.com/a/PCcjo
这样直接填绝对不会出问题,但是感觉这样就没有什麽练习的意义
想请问大大还有什麽写法吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.158.217
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1511350885.A.4E1.html
1F:推 bxxl: 把副程式改成MACRO试试? 11/22 19:49
2F:→ bxxl: 其实你应该去看翻出来的组合语言,看哪个部份指令/cycle最多 11/22 19:50
3F:→ bxxl: 才能决定要改哪里 11/22 19:50
4F:推 bxxl: 另感觉程式结构颇奇怪,为什麽亮第n号灯的函数不用给参数n? 11/22 19:59
5F:→ bxxl: 而是用第几次call他来设计,难道是用global counter吗? 11/22 20:00
6F:→ bxxl: 可这样设计并不好 11/22 20:00
7F:→ bxxl: 再来,你可以先把所有的灯都reset一次再去点你要的灯, 11/22 20:02
8F:→ bxxl: 这样逻辑上或许会简单一些. 11/22 20:03
9F:推 mentchin: make the common case faster. 11/22 22:02
10F:→ yuleen123: 将 RGB 资料先写进一个 3*6=18bytes 的缓冲区 11/22 22:56
11F:→ yuleen123: 之後再一次全部送出去 11/22 22:56
12F:→ god145145: i,j是uint8_t吗? 11/22 23:14
i,j是我开头会宣告int,我没有相关基础,是看书本自己瞎写的
这个用法参考书本里的单灯位移来改的,所以很low我也知道qq
※ 编辑: IOP14759 (60.248.158.217), 11/23/2017 09:01:56
13F:推 yudofu: 除非不立刻reset会有问题,否则把该点的灯号都点完,收到r 11/23 09:43
14F:→ yudofu: eset讯号再设定一次LED全黑表示reset,然後再真的reset, 11/23 09:43
15F:→ yudofu: 最後再从头开始点灯就好了。 11/23 09:43
16F:推 DRQX: 架构重新检讨可能会更好 11/23 15:42