IAR读代码

  1. 关于extern变量的使用:

若a.c中需引用b.c中的变量int v,可以在a.c中声明extern int v,然后就可以引用变量v;需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到变量v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这里涉及到另外一个话题---变量的作用域。能够被其他模块以extern引用到的变量通常是全局变量。

  还有一点是,extern int v可以放在a.c中的任何地方,比如可以在a.c中函数func()定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在func()作用域中引用变量v(这还是变量作用域的问题,对于这一点来说,很多人使用时都心存顾虑,好像extern声明只能用于文件作用域似的)。

2. PORTD_ISFR  & (1 << n):

PIRTD_ISFR寄存器的第n位为1时触发中断

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是IAR提供的一些常用的原子操作代码: 1. 原子操作: ```c uint32_t __ldrex(volatile uint32_t *addr) ``` 使用示例: ```c volatile uint32_t shared_var = 0; uint32_t read_var; read_var = __ldrex(&shared_var); ``` 2. 原子写操作: ```c uint32_t __strex(uint32_t val, volatile uint32_t *addr) ``` 使用示例: ```c volatile uint32_t shared_var = 0; uint32_t write_var = 123; if (__strex(write_var, &shared_var) == 0) { // 写入成功 } else { // 写入失败 } ``` 3. 原子清除操作: ```c void __clrex(void) ``` 使用示例: ```c volatile uint32_t shared_var = 0; uint32_t read_var; read_var = __ldrex(&shared_var); // 使用共享变量 __clrex(); // 清除同步标志位,允许其他CPU/中断修改共享变量 ``` 4. 数据内存屏障操作: ```c void __dmb(void) ``` 使用示例: ```c volatile uint32_t shared_var = 0; uint32_t read_var; read_var = __ldrex(&shared_var); // 使用共享变量 __dmb(); // 确保内存访问的顺序性 ``` 5. 指令内存屏障操作: ```c void __isb(void) ``` 使用示例: ```c volatile uint32_t shared_var = 0; uint32_t read_var; read_var = __ldrex(&shared_var); // 使用共享变量 __isb(); // 清空流水线,从新的地址开始执行 ``` 以上是一些常用的IAR原子操作代码,可以帮助我们实现多线程编程或者中断处理中对共享资源的访问控制。需要注意的是,这些指令只能用于32位数据类型的操作。如果需要对其他数据类型进行操作,可以使用其他类型的原子指令,例如8位或者16位原子指令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值