MPW33F272K512 ARM32 BIT 单片机













13.5.2
位带操作的好处
把前面的机制换算成工程收益,大致六点。
位操作变便宜。改一位原来要两次总线访问、三条指令,现在只剩一次写(或一次读)。单次省不了多少,放在高频翻转IO、密集置标志的中断里,省下的会累加。代码更短,也更不容易错。不用记每个寄存器的位掩码,不用拼&=~(1<<n)这种表达式,写成PAout(5)=1就完事;掩码抄错、移位方向写反这类低级失误随之消失。
动态功耗略降。少了一次整寄存器读回和一次整字写回,总线事务数下降。单项不大,但在位操
作密集的场合能量出来。位可以单独寻址。每一位都有自己的别名地址,能当变量用,也能把地址本身传进函数,不用再连寄存器地址带位号一起传两个参数。并发不用加锁。中断和主循环共用一个标志字时,各写各位即可,不必关中断,中断响应时间不受影响(机制见5.1)。读、置、清都直白,翻转要走两步。读回来是0或1;写1置位、写0清零;想翻转就先读后写反值。注意“读一写反”这两步之间不保证原子,真要原子翻转就改用 BSRR或临时加锁。
13.6
总结
位带没有新增指令,没有新增外设,也没有新增内存。它做的只有一件事:把地址空间重新分配了一
遍,让每一个比特都拥有一个属于自己的字地址。换来的东西却是三样。
对位的操作变成对字的操作,而且由硬件保证原子--改一个位不再需要“先读回来"这一步。
并发控制被简化。中断、任务、DMA共用寄存器或标志字时,不必再靠关中断和加锁去堵时间
窗口。
负担
代码表达更贴近意图。PAout(5)=1直接说清“把第5位置起来”,省掉掩码与移位带来的阅读
它的边界同样明确:只覆盖两块各1MB的区域,只保证单次位操作,别名区不是存储,写进去的
值只有最低位有用。把这几条记牢,用起来就不容易出岔子。
真正需要判断的其实只有一句话:这个位,会不会和别处的访问撞上。会撞,就用位带(多位齐动时
用BSRR);不会撞,普通的读-改-写也没什么问题。理解位带的过程,顺带也是理解Cortex-M总线结
构与原子性设计思想的过程--这部分收益,比省下的那两条指令更长。


STC33悄然而至,从STC8/AI8051U学MCU原理,原理掌握后,直接使用STC8/STC32/STC33
https://www.stcaimcu.com/thread-25652-1-1.html
(出处: 国芯人工智能技术交流网站)
更多推荐

所有评论(0)