你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

调度器原子变量相关问题

[复制链接]
patch1582 提问时间:2026-7-3 17:20 / 未解决

我以往写调度器都会用 volatile 修饰标志位,写法非常简单:

volatile uint8_t myflag;

uint8_t ticks;

void Func(void){

++ticks;

if(!(ticks % 5)){

myflag = true;

}

}

void User(void){

if(myflag) {

myflag = false;

//执行任务

}

}

网上普遍观点认为上面这种写法并不安全 —— 缺少内存屏障。正确方案应该使用原子类型,于是我改成了原子变量实现:

atomic_bool myflag = ATOMIC_VAR_INIT(false);

uint8_t ticks;

void Func(void){

++ticks;

if(!(ticks % 5)){

atomic_store(&myflag ,true);

}

}

void User(void){

if(atomic_load(&myflag)) {

atomic_store(&myflag ,false);

//执行任务

}

}

但这套代码无法正常工作,User函数会经常性漏掉标志置位事件,不只是延迟,而是直接丢失一整轮标志。

我试过把原子变量再加 volatile 修饰,也试过atomic_flag,都会丢标志;但老式 volatile 写法却不会丢失任何一次置位。请问问题出在哪里?

收藏 评论2 发布时间:2026-7-3 17:20

举报

2个回答
fafa1 回答时间:昨天 21:37

你遇到的不是“内存屏障”或“原子类型”的逻辑问题,而是标准库实现层 的问题。 最佳实践 :在嵌入式 RTOS 或裸机调度器中,中断设置标志位、主循环查询标志位 ,使用 volatile uint8_tvolatile sig_atomic_t 就足够了,无需画蛇添足改为 C11 原子类型。C11 原子更适合多核多线程间的激烈竞争,对于单核中断上下文,反而是笨重且容易引入隐藏依赖的“陷阱”。

deepseek 说的

cove 回答时间:12 小时前

把相关代码的反汇编贴出来

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版