您好...
是否有办法执行 uint8_t 变量的原子增量或减量?
是否需要使用互斥量?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好...
是否有办法执行 uint8_t 变量的原子增量或减量?
是否需要使用互斥量?
您好、Mauro、
TI-RTOS 是抢先式调度程序: https://dev.ti.com/tirex/explore/node?node=AEwahlHnEy6Wj4XMYzQTrQ__fc2e6sr__LATEST
此致、
Sarah
与"抢先式"无关。 如果任务 A 的优先级高于任务 B、那么您可能可以在任务 A 中删除原子保护代码(互斥量或禁用/启用中断) 但这样做是危险的、因为您将来可能会更改任务 A/B 的优先级。 因此、在将修改此共享变量的所有任务中使用互斥量总是更安全。
CC3235的 CPU 是 Cortex-M4、它支持 LDREX/STREX 指令来执行原子操作。 TI-RTOS 应利用这些指令来实现互斥。 因此、使用互斥量时、开销应该非常小。 但您也可以使用 LDREX/STREX 指令自行自动修改变量。 您可以在 C 代码中使用内在函数__ldrexb()和__strexb()。
我相信您可以用 google 搜索大量 LDREX/STREX 示例。
更换
numData ++;
作者
while (1){
uint8_t count =__ldrexb (&numData);
count++;
if (__strexb (count、&numData)= 0){
asm (" dmb");
break;
}
将上面的代码替换为"numData--",改为"count--"。
我没有测试代码、但它应该可以正常工作。 概念很简单。 您应该学习和研究相关文档、以了解其工作原理。