【IoT】蓝牙BLE基础:CC2541 BLE临界资源保护
发布日期:2021-05-08 10:08:51 浏览次数:23 分类:精选文章

本文共 2064 字,大约阅读时间需要 6 分钟。

临界区代码保护示例

在嵌入式系统中,临界资源保护是一个至关重要的环节。为了确保系统的安全性和稳定性,我们可以采用代码保护机制,通过临界区管理来防止中断对关键资源的干扰。在本文中,我们将详细介绍一种基于中断控制的临界区保护方法,并展示其在不同平台代码设计中的应用。

临界区代码保护的实现

1. 临界区代码保护的示例

在本例中,我们采用了一种基于中断控制的临界区保护方法。通过对中断状态的管理,我们可以在临界资源访问时进入安全状态,从而保护资源不受中断干扰。以下是实现临界区代码保护的关键步骤:

  • 进入临界区:通过调用 HAL_ENTER_CRITICAL_SECTION(x) 函数,我们可以将当前的中断状态 x 记录下来,并关闭所有中断。这样,系统进入临界状态,所有后续操作都可以安全地执行。

  • 执行临界资源操作:在临界状态下,我们可以安全地访问和操作关键资源。例如,修改共享变量、释放锁机制等操作都可以在此阶段执行。

  • 退出临界区:在临界资源操作完成后,通过调用 HAL_EXIT_CRITICAL_SECTION(x) 函数,我们可以恢复原有的中断状态,从而退出临界区。

  • 2. 相关宏定义

    为了实现上述临界区保护机制,我们定义了一系列宏。这些宏通过对中断状态的控制和管理,确保了临界资源的安全性。

  • st(x)

    该宏用于执行一个完整的语句块。其实现方式通过 do { x } while (__LINE__ == -1) 来实现。__LINE__ 是一个预处理器宏,表示当前代码行的编号。由于 __LINE__ 总是大于0,所以 __LINE__ == -1 只能等价于0。因此,该宏实际上等价于 do { x } while(0),用于执行一个完整的语句块。

  • HAL_ENABLE_INTERRUPTS()HAL_DISABLE_INTERRUPTS()

    这两个宏用于控制所有中断的使能和关闭。通过调用 HAL_ENABLE_INTERRUPTS(),我们可以使能所有中断;通过调用 HAL_DISABLE_INTERRUPTS(),我们可以关闭所有中断。

  • 临界区进入和退出宏

    • HAL_ENTER_CRITICAL_SECTION(x)

      该宏用于进入临界区。它首先将当前的中断状态 x 记录下来,然后关闭所有中断,从而进入临界状态。

    • HAL_EXIT_CRITICAL_SECTION(x)

      该宏用于退出临界区。它通过将中断状态恢复为保存的值,从而退出临界状态。

  • 临界状态语句宏

    HAL_CRITICAL_STATEMENT(x) 通过执行临界状态语句块,确保在临界区中对资源进行安全操作。该宏首先声明一个变量用于保存中断状态,然后调用 HAL_ENTER_CRITICAL_SECTION 进入临界区,执行临界资源操作,最后调用 HAL_EXIT_CRITICAL_SECTION 退出临界区。

  • 扩展:临界区代码保护的应用

    1. 其他平台代码设计中的应用

    在不同平台的代码设计中,临界区保护机制可以通过类似的方式实现。以下是一个典型的应用示例:

    #include 
    #define st(x) do { x } while (__LINE__ == -1)#define enable() st(EA = 1;)#define disable() st(EA = 0;)#define enter(x) st(x = EA; disable())#define exit(x) st(EA = x;)#define critical(s) st(int temp; enter(temp); s; exit(temp);)int EA = 5;int main(){ int a = 0; enter(a); printf("EA=%d, a=%d\n", EA, a); exit(a); critical(printf("hello world-first\n");); critical(printf("hello world-second\n");); return 0;}

    2. 代码解释

    在上述代码中:

  • enter(a)exit(a)

    这两个函数用于进入和退出临界区。enter(a) 将当前的中断状态 a 记录下来,并关闭所有中断;exit(a) 则恢复中断状态 a

  • critical(s)

    该宏用于包装临界资源操作。通过调用 enter(temp) 进入临界区,执行临界资源操作 s,最后调用 exit(temp) 退出临界区。

  • st(x)

    该宏用于执行一个完整的语句块。它通过 do { x } while(0) 来实现,确保语句块能够被正确执行。

  • EA

    EA 是一个全局变量,用于存储和恢复中断状态。

  • 通过上述机制,我们可以在不同平台中实现临界资源的安全保护,从而确保系统的稳定性和可靠性。

    上一篇:【IoT】TI BLE CC2541 串口控制蓝牙详解
    下一篇:【企业】海底捞,知多少? 学什么?

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年05月06日 16时27分03秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章