OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9114|回复: 9

初学嵌入式编程困惑之——互斥与同步

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
发表于 2015-5-19 10:32:10 | 显示全部楼层 |阅读模式
5金钱
我做纯软件开发已经有些年头了,最近项目需要,接触到嵌入式软件的开发。因为经验基本为零,也没有任何指导,通过网上的搜索,发现正点原子的STM32F4探索者评价不错,非常适合初学者入手,通过这半个月的接触,感觉的确非常不错,文档齐全,由浅入深,性价比很高。
不过还是有许多疑问,希望得到各位前辈坛友的答疑解惑。
第一个疑惑是关于互斥与同步。
以库函数版本的示例4,串口通讯工程为例,变量USART_RX_STA为全局变量,有两个地方会去对其进行修改,一个是中断处理函数USART1_IRQHandler,一个是主程序main函数,我的理解是,USART1_IRQHandler和main好比在两个线程,但是针对USART_RX_STA的修改为何不需要互斥操作呢。或者我对中断的理解不对,是否在进入一个中断处理函数时,main会被挂起,中断处理函数执行完毕后,main才会解挂,继续执行?

另外,单片机编程是否有多线程的概念呢,我网上搜了下,搜不到同步互斥的概念。

最佳答案

查看完整内容[请看2#楼]

1、首先,基础例程没有用到操作系统,没有系统就没有线程和进程这个概念!F4只有一个CPU,一次只可能有处理一个东西,在处理中断服务函数的时候绝对是不会执行main()函数的。同样执行main()函数的时候也绝对不会执行中断服务程序。 2、嵌入式开发和PC软件开发区别还是很大的,搞嵌入式开发需要你懂硬件,操作系统,而PC软件开发这些都不用管,别人已经做好了。 3、如果只是使用F4开发板的基础例程的话,没有用到操作系统,所以没有 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-5-19 10:32:11 | 显示全部楼层
1、首先,基础例程没有用到操作系统,没有系统就没有线程和进程这个概念!F4只有一个CPU,一次只可能有处理一个东西,在处理中断服务函数的时候绝对是不会执行main()函数的。同样执行main()函数的时候也绝对不会执行中断服务程序。
2、嵌入式开发和PC软件开发区别还是很大的,搞嵌入式开发需要你懂硬件,操作系统,而PC软件开发这些都不用管,别人已经做好了。
3、如果只是使用F4开发板的基础例程的话,没有用到操作系统,所以没有同步和互斥的概念!
开往春天的手扶拖拉机
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
 楼主| 发表于 2015-5-19 10:49:14 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
了解了,太感谢了~~
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2015-5-19 13:20:13 | 显示全部楼层
纯软件开发的能搞硬件???
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
 楼主| 发表于 2015-5-19 13:36:30 | 显示全部楼层
回复【4楼】三叶草:
---------------------------------
硬件搞不了,尝试配合搞硬件的写嵌入式软件这块。
回复

使用道具 举报

0

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-3-7
在线时间
0 小时
发表于 2015-5-19 14:46:36 | 显示全部楼层
“变量USART_RX_STA为全局变量,有两个地方会去对其进行修改,一个是中断处理函数USART1_IRQHandler,一个是主程序main函数”

这种情况下,一般需要保证对变量USART_RX_STA操作的原子性
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2015-5-19 15:43:44 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
int index;//全局变量,主函数和中断都调用

//主函数
main()
{
    while(1)
    {
         if(index == 10)
         {
              printf("index = %d\n", index);
         }
         index++;
     }
}

//中断函数
void interruptFunc(void)
{
     index++;
}

上面的程序中,index可能输出不是10,因为在main执行完if(index == 10)后,如果这时中断来了index就会被改变,会导致printf("index = %d\n", index);打印的index的值不是10。
这种情况和多线程有点类似了。
持续而安静地投入
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-5-19 15:58:41 | 显示全部楼层
回复【7楼】磨剑:
-------------------------
你这中写法即使是用上互斥信号量对index做保护也会出现你说的问题的。因为不管怎么样中断都会对index++,这个是程序员写程序逻辑不严谨。
开往春天的手扶拖拉机
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2015-5-19 19:23:10 | 显示全部楼层
回复【8楼】zuozhongkai:
---------------------------------
只是说这种情况和题主说的情况差不多。那什么情况下允许在main函数和中断函数里面操作相同的全局变量?如何避免这种使用相同变量导致的问题?
持续而安静地投入
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
 楼主| 发表于 2015-5-20 09:32:03 | 显示全部楼层
回复【6楼】揭阳老咸菜:
---------------------------------
是的,我就是不确定赋值操作“USART_RX_STA=1”是否具有原子性,感觉是的。

原子操作有定义吗。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 15:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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