OpenEdv-开源电子网

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

有个问题,虽然解决了,可我实在想不明白

[复制链接]

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
发表于 2014-6-20 11:04:58 | 显示全部楼层 |阅读模式
5金钱
 OSSemPend(EXIT_GUISem,0,&err);  
   OS_ENTER_CRITICAL();
       switch(Key_Mark)
      {
case 1:
if(SET_Make == 0)
     {  
  delay_ms(10);
  if(SET_Make == 0)
       {
   buzzer();
     while(!(SET_Make));
我用的UCOSII,这是判断按键的程序,在有按键按下去的时候,发送一个信号量给这个程序,然后这里关闭中断OS_ENTER_CRITICAL();开始执行判断按键的程序·。问题就出在这里 buzzer(); 上面,这是个蜂鸣器响的响程序,很简单。
我设计了三个项目,这三个项目蜂鸣器的输出IO口分别是PA4,PB8,PB5。前两个这样设计程序的话蜂鸣器都会响,可第三个PB5就不响,我把OS_ENTER_CRITICAL();注释掉就可以恢复正常,请问这是怎么回事?

最佳答案

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

我曾经碰到过这样的,用的是FREERTOS,两个任务,都是打印数据的,TASK1,打印"hello rtos\n",TASK2,打印"ghoul app", 然后在发现在实际打印的时候会出现,hell app,he ghol,,,就是字符顺序不对的情况,, 后来针对这样的情况,我就另外弄了个任务,用来专门用来打印数据,,在应用程序要打印数据的时候,先把数据准备好,然后,发送队列小心,阻塞若干的TICK时间,用来专门打印数据,这样的话,就没出现,字 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-6-20 11:04:59 | 显示全部楼层
我曾经碰到过这样的,用的是FREERTOS,两个任务,都是打印数据的,TASK1,打印"hello rtos\n",TASK2,打印"ghoul app",
然后在发现在实际打印的时候会出现,hell app,he ghol,,,就是字符顺序不对的情况,,
后来针对这样的情况,我就另外弄了个任务,用来专门用来打印数据,,在应用程序要打印数据的时候,先把数据准备好,然后,发送队列小心,阻塞若干的TICK时间,用来专门打印数据,这样的话,就没出现,字符乱码的情况,
跟你说这个的意思就是,有可能,你在执行打印数据的时候,那个任务的获得的执行时间有可能结束了,发生了任务切换,
delay_ms(10); 
  if(SET_Make == 0)
       {
   buzzer(); 
在执行的时候,发生了任务切换,
还有,像按键这个东西,你是跑OS的,所以不推荐使用delay_ms(10); 这样的延时方式,这样用,工程小还可以,稍微大点,就容易出问题,,而且调试起来也很麻烦,
回复

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-6-20 11:08:09 | 显示全部楼层
关于第三个项目蜂鸣器不响的,仿真一步一步调试话可以响,可在程序运行中就不响
回复

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-6-20 11:29:38 | 显示全部楼层
或者超过一个TICK的时间了,
回复

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-6-20 11:34:41 | 显示全部楼层
回复【3楼】lxj19901115:
---------------------------------
请问什么意思?如果超过的话,另外两个也应该,可那两个1项目运行正常,我设置的时钟节拍也一样大
回复

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-6-23 16:12:07 | 显示全部楼层
打个比方,你用38400的波涛率,你算下,1S中的通信速度,理论是3800多个字节,也就是说发送一个BYTE的时候,要用3.8MS,如果你发送的数据,是10个的话,并且你的TIK的间隔很短的话,比如是10MS的话,就会有可能发生,你在发送数据的时候,发生任务切换,,,不知道这样对不对,,
回复

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2014-6-23 16:20:41 | 显示全部楼层
最好使用软件定时器,进行回调,定时调用,在扫到按键之后,立即发送消息,,
回复

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-6-23 18:57:49 | 显示全部楼层
回复【7楼】lxj19901115:
---------------------------------
XIEXIE
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 00:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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