硬汉嵌入式论坛

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

[技术讨论] usRxWrite 变量临界区保护

[复制链接]

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2022-3-15 14:27:33 | 显示全部楼层 |阅读模式
我是新手小白,刚学到串口程序,对于其中有一段代码不太理解,就是这个变量临界区保护是什么原因,如果不进行保护又会怎样呢,感谢大佬解答!
1.JPG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2022-3-15 15:17:04 | 显示全部楼层
当前这几个中断和任务里面都调用的变量做了__IO声明,可以防止编译器优化,实时读取最新值。
如果任务里面仅仅是读取操作,可以不用加保护了。

  1. /* 串口设备结构体 */
  2. typedef struct
  3. {
  4.         USART_TypeDef *uart;                /* STM32内部串口设备指针 */
  5.         uint8_t *pTxBuf;                        /* 发送缓冲区 */
  6.         uint8_t *pRxBuf;                        /* 接收缓冲区 */
  7.         uint16_t usTxBufSize;                /* 发送缓冲区大小 */
  8.         uint16_t usRxBufSize;                /* 接收缓冲区大小 */
  9.         __IO uint16_t usTxWrite;        /* 发送缓冲区写指针 */
  10.         __IO uint16_t usTxRead;                /* 发送缓冲区读指针 */
  11.         __IO uint16_t usTxCount;        /* 等待发送的数据个数 */

  12.         __IO uint16_t usRxWrite;        /* 接收缓冲区写指针 */
  13.         __IO uint16_t usRxRead;                /* 接收缓冲区读指针 */
  14.         __IO uint16_t usRxCount;        /* 还未读取的新数据个数 */

  15.         void (*SendBefor)(void);         /* 开始发送之前的回调函数指针(主要用于RS485切换到发送模式) */
  16.         void (*SendOver)(void);         /* 发送完毕的回调函数指针(主要用于RS485将发送模式切换为接收模式) */
  17.         void (*ReciveNew)(uint8_t _byte);        /* 串口收到数据的回调函数指针 */
  18.         uint8_t Sending;                        /* 正在发送中 */
  19. }UART_T;
复制代码





回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2022-3-15 15:27:52 | 显示全部楼层
哦哦,可是我看的程序里面这些变量好像没有做__IO声明呀,如果不做__IO声明应该没有大影响吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2022-3-15 15:31:37 | 显示全部楼层
那时花开沁园春 发表于 2022-3-15 15:27
哦哦,可是我看的程序里面这些变量好像没有做__IO声明呀,如果不做__IO声明应该没有大影响吧

不做不行,不做的话,会存在这个变量的值临时记录在寄存器里面,而这个值不是变量的最新值,这样就与我们的意愿违背了。
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2022-3-15 15:41:15 | 显示全部楼层
哦哦,好的,还有一个问题就是之前忘记问了,就是那个临界区保护具体是代码里面的什么操作,我可以理解为那个先关中断进行数据读取之后再开中断吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107641
QQ
发表于 2022-3-15 16:34:54 | 显示全部楼层
那时花开沁园春 发表于 2022-3-15 15:41
哦哦,好的,还有一个问题就是之前忘记问了,就是那个临界区保护具体是代码里面的什么操作,我可以理 ...

可以,临界区主要是处理任务调用的环境,或者任务和中断之间调用操作同一个数据。这种场景比较多。
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2022-3-16 10:10:16 | 显示全部楼层
哦哦,好的,谢谢硬汉哥!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-9 09:16 , Processed in 0.247128 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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