硬汉嵌入式论坛

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

[有问必答] 对位域进行bit操作,会影响其他bit位值,但将操作语句放入临界段就不会影响

[复制链接]

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2024-11-15 16:41:18 | 显示全部楼层 |阅读模式
是因为用做保护,但偶尔无法自动重新启动,发现是故障标志位bit在未执行到清0时,已经被清0了,把位域变量换成short类型变量是没有问题的,将主循环的位域赋值放入临界段也没有问题;

有两个中断在运行,一个是滴答时钟中断,一个是adc中断,adc触发采样由150k的hrpwm触发.
大概就是代码这种操作复现的,想问一下各位大哥有没有其他解决方法,总不能每个位域都加入到临界段;



void SysTick_Handler(void)
{
       
        if(g_fig == 1)
        {
        g_fig = 0;
        g_fault_status.bits.short_cur = 1;
        }
}


void ct_control_system_execute(void)

{
//    __disable_irq();

        g_fault_status.bits.in_v_under = 1;
//    __enable_irq();

        if(g_fault_status.bits.short_cur)
        {
                g_fault_status.bits.short_cur = 0;
                g_fig = 1;

        }
}

回复

使用道具 举报

6

主题

268

回帖

286

积分

高级会员

积分
286
发表于 2024-11-16 09:35:56 | 显示全部楼层
位赋值并不是一条原子语句,看汇编代码你会发现生成的代码至少有十来条语句,所以两处赋值很容易冲突,简单的就在中断里单独弄个变量赋值,在中断外两将两个变量处理
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-16 10:56:28 | 显示全部楼层
楼主用的那个系列,支持硬件位带不,可以使用这个试试

推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置(2021-12-10)
https://www.armbbs.cn/forum.php? ... 9508&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-11-18 10:26:12 | 显示全部楼层
eric2013 发表于 2024-11-16 10:56
楼主用的那个系列,支持硬件位带不,可以使用这个试试

推荐一种超简单的硬件位带bitband操作方法,让变 ...

谢谢硬汉哥
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2024-11-18 10:31:33 | 显示全部楼层
fxyc87 发表于 2024-11-16 09:35
位赋值并不是一条原子语句,看汇编代码你会发现生成的代码至少有十来条语句,所以两处赋值很容易冲突,简单 ...

感谢解答,我准备直接使用内联函数,在函数中使用位操作,就放弃用位域了,出问题太不好找了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 05:44 , Processed in 0.229724 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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