硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1099|回复: 2
收起左侧

程序看不懂

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-7-31 11:36:53 | 显示全部楼层 |阅读模式

__IO uint8_t Code ;
新手   前面__IO是什么意思啊

回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2024-7-31 15:29:08 | 显示全部楼层
通常有这样的定义
#define     __IO    volatile             /*!< Defines 'read / write' permissions */
就是C语言关键词volatile,有这个关键词的变量,保证每次读到的都是对应内存中的值。简单理解就是禁止优化。

举两个例子


如果在a赋值语句和b赋值语句之间触发了中断,中断里对testV改变值。
出中断后,由于优化的存在,恢复现场后R5的值和实际testV值不同了,就会造成错误。

[C] 纯文本查看 复制代码
uint8_t testV;

a = testV; // 这里会把testV的值给到寄存器例如R5然后赋给a
b = testV; // 如果有开优化 b变量可能会被直接赋值R5 节省几条语句操作





使用volatile 关键词,即使在a赋值语句和b赋值语句之间触发了中断,中断里对testV改变值。
出中断后,执行b赋值,程序也依然会从实际内存中重新读值。

[C] 纯文本查看 复制代码
volatile uint8_t testV;

a = testV; // 这里会把testV的值给到寄存器例如R5
b = testV; // 再次把testV的值给到寄存器再赋给b



对于硬件相关寄存器通常都会有这个__IO   ,我觉得这也是徒增理解成本。
在硬件外设相关或者跨线程的变量一般要加 volatile 关键词修饰。

菜鸟教程讲的很详细
C/C++ 中 volatile 关键字详解 | 菜鸟教程 (runoob.com)
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-8-2 11:57:10 | 显示全部楼层
厉害了 原来是个关键字宏定义 看scdn里面单个程序 看的我一头雾水 找不到来源 谢谢解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:52 , Processed in 0.036553 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表