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.

[参考译文] CC3235MODASF:原子增量、减量

Guru**** 2532100 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/949995/cc3235modasf-atomic-increment-decrement

器件型号:CC3235MODASF

您好...

是否有办法执行 uint8_t 变量的原子增量或减量?

是否需要使用互斥量?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了操作系统提供的互斥量外、您还可以禁用/启用中断(设置/清除全局中断屏蔽)。

    如果只有一个任务将写入该变量、而其他任务将只读取该变量、则无需自动写入该变量。 因此、有时您可以使用两个变量来防止互斥。 只有任务 A 将写入变量 A、只有任务 B 将写入变量 B 任务 A 和 B 都将读取变量 A 和 B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、您可以告诉我、TI-OS 不是抢先式的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mauro、

    TI-RTOS 是抢先式调度程序: https://dev.ti.com/tirex/explore/node?node=AEwahlHnEy6Wj4XMYzQTrQ__fc2e6sr__LATEST

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、那么、如果我在一个 SW 任务中增加一个 uint8_t 变量并且在另一个 SW 任务中减少这个 uint8_t 变量、我必须互斥这个运算

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    与"抢先式"无关。 如果任务 A 的优先级高于任务 B、那么您可能可以在任务 A 中删除原子保护代码(互斥量或禁用/启用中断) 但这样做是危险的、因为您将来可能会更改任务 A/B 的优先级。 因此、在将修改此共享变量的所有任务中使用互斥量总是更安全。

    CC3235的 CPU 是 Cortex-M4、它支持 LDREX/STREX 指令来执行原子操作。 TI-RTOS 应利用这些指令来实现互斥。 因此、使用互斥量时、开销应该非常小。 但您也可以使用 LDREX/STREX 指令自行自动修改变量。 您可以在 C 代码中使用内在函数__ldrexb()和__strexb()。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有两项任务:

    一种方法是将一些数据放入 FIFO 中、并计算 FIFO 中有多少数据

    for (;;)
    {
    if (numData <可用空间)
    {
    /*写入数据*/
    
    numData ++;
    }
    } 

    其他弹出数据

    for (;;)
    {
    if (numData >0)
    {
    /*读取数据*/
    
    numData --;
    }
    } 

    如何使用 LDREX/STREX?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我相信您可以用 google 搜索大量 LDREX/STREX 示例。

    更换

    numData ++; 

    作者

    while (1){
    uint8_t count =__ldrexb (&numData);
    count++;
    if (__strexb (count、&numData)= 0){
    asm (" dmb");
    break;
    }
    

    将上面的代码替换为"numData--",改为"count--"。

    我没有测试代码、但它应该可以正常工作。 概念很简单。 您应该学习和研究相关文档、以了解其工作原理。