c/c++语言开发共享如何在ARM7中进行primefaces比较和交换?

我想修改一个全局变量,它由RTOS中的不同任务和IRQ上下文共享。 因此我需要primefaces地修改这个变量。 在我当前的实现中,我一直在使用enable_irq / disable_irq函数来自动修改语句。

extern int g_var; void set_bit_atomic(int mask) { disable_irq(); g_var |= mask; enable_irq(); } 

我在GCC 文档中找到了__sync_bool_compare_and_swap函数作为primefaces操作的帮助器。

我目前的工具链是KEIL MDK,我想切换到下面显示的方法,

 void set_bit_atomic(int mask) { volatile int tmp; do { tmp = g_var; } while (!__sync_bool_compare_and_swap(&g_var, tmp, tmp | mask)); } 

如何在ARMv4命令集中编写__sync_bool_compare_and_swap函数(作为内联汇编)?

    我在Linux内核源代码中找到了__kernel_cmpxchg函数的类似实现。

    它是为ARMv5及更早版本编写的,它似乎适用于ARM7TDMI(ARMv4)。

     1: ldr r3, [r2] @ load current val subs r3, r3, r0 @ compare with oldval 2: streq r1, [r2] @ store newval if eq rsbs r0, r3, #0 @ set return val and C flag bx lr @ or "mov pc, lr" if no thumb support 

    详情可在此链接中找到。

    我想提出两个重要问题,

    交换发生时,1- __kernel_cmpxchg返回0,而__sync_bool_compare_and_swap函数返回true。

    2-function原型是不同的。

     typedef int (*__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr); #define __kernel_cmpxchg ((__kernel_cmpxchg_t)0xffff0fc0) bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) 

    因此我不得不改变用法如下,

     void set_bit_atomic(int mask) { volatile int tmp; do { tmp = g_var; } while (my_compare_and_swap(tmp, tmp | mask, &g_var)); } 

    警告:没有内核支持,此代码无法正常运行。 请参阅以下评论。

      以上就是c/c++开发分享如何在ARM7中进行primefaces比较和交换?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559624.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐