硬汉嵌入式论坛

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

[有问必答] 【求助】uC/OS II中消息邮箱/队列在中断中使用时消息传递方法有疑问及多任务时任务

[复制链接]

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2016-3-15 09:50:44 | 显示全部楼层 |阅读模式
我有4个关于uC/OS II的问题,请硬汉及各位大神帮帮忙。


问题一、我有3个任务,处理方式如下:
task1任务负责在液晶第一行显示串口中断中接收到的数据,优先级为3;采用中断中发消息邮箱/队列,任务中读消息后在液晶上显示方式。
task2任务负责在液晶第二行显示实时时钟数据,优先级为4;每隔800ms运行一次该任务。
task3任务负责在液晶第三行显示实时温度数据,优先级为5;每隔1s运行一次该任务。

现在遇到/出现的问题:
液晶死机了【实时数据不动了,我估计是任务2或3正在操作液晶,但是任务1中断后,由于它的优先级最高,进而任务1操作液晶,这样两个任务同时操作一个液晶,液晶乱了就不显示了?】
求助:这些任务怎么协调液晶才不死机呢?共享设备访问加信号量?我的要求是任务1的数据显示要非常的实时,即如果其他任务正在使用液晶,它也要让出来,要任务1来使用。
我以前在中断中显示任务1的数据,这样液晶很容易死机。后来把中断中任务切换的语句【OSIntEnter();和OSIntExit(); 】去掉后,液晶暂时不死机了,但是数据显示有点滞后或少显示数据。

问题二:执行OSIntExit();    后,中断返回了没有呢?按照我的理解,执行该函数后,os会调用就绪的高优先级任务,似乎任务嵌套到中断中了。

void UART5_IRQHandler(void)
{
  OS_CPU_SR  cpu_sr;

  OS_ENTER_CRITICAL();                        
  OSIntEnter();
  OS_EXIT_CRITICAL();

  UartIRQ(&g_tUart5);

  OSIntExit();                           
}

问题三:同问题二,假如执行OSIntExit();     后中断没有返回,下面的ucCount就不用定义成全局(静态)变量了,定义局部零时变量即可。


【疑问】:任务的优先级没有中断的优先级高,任务怎么会嵌套到中断中呢?我实际测试,即把ucCount定义成局部零时变量,我的消息传递也是正确的,我把ucCount定义成静态变量效果相同,只是偶尔出一个非常大的数据。这个测试是否可以证明执行OSIntExit();     后中断没有返回呢?如果返回了,OSIntExit();    中的具体那句话是返回中断,恢复现场的语句呢?



/* 特别注意,uCOS-II消息队列传递的是地址。
   所以不要将变量定义放在中断程序中,退出中断后变量空间会释放给系统堆栈。
*/
uint8_t s_ucCount1 = 0;
uint16_t s_ucCount2 = 0;
uint32_t s_ucCount3 = 0;
static void TIM_CallBack1(void)
{
    s_ucCount1 += 1;
    s_ucCount2 += 2;
    s_ucCount3 += 3;
    /* 连续向消息队列中发送3次数据 */
    OSQPost(CommQ, (void *)&s_ucCount1);
    OSQPost(CommQ, (void *)&s_ucCount2);
    OSQPost(CommQ, (void *)&s_ucCount3);
}

谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-15 09:53:40 | 显示全部楼层
第一眼看到楼主的帖子,整理的非常好,我看看问题,一一解答下。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-15 09:55:31 | 显示全部楼层

回 eric2013 的帖子

eric2013:第一眼看到楼主的帖子,整理的非常好,我看看问题,一一解答下。 (2016-03-15 09:53) 
谢谢硬汉哥,整理好别人看着舒服,也好给你回答问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-15 10:05:30 | 显示全部楼层
1. 共享一个设备是必要要加互斥信号量的,现在emWin的多任务显示就行这样。
2. 绝对不会有任务嵌套到中断里面的情况。
3. ucCount定义成局部变量没问题是因为系统栈的这个位置此时没有被占用,即你退出中断后,系统栈的这个位置的数据还在。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-15 11:53:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 共享一个设备是必要要加互斥信号量的,现在emWin的多任务显示就行这样。
2. 绝对不会有任务嵌套到中断里面的情况。
3. ucCount定义成局部变量没问题是因为系统栈的这个位置此时没有被占用,即你退出中断后,系统栈的这个位置的数据还在。
 (2016-03-15 10:05) 
1、低优先级的任务正在使用液晶,高优先级的任务在中断后获得了消息,它要使用液晶,这时互斥信号量只是把低优先级任务的优先级暂时提高,低优先级任务使用完液晶后,高优先级任务才使用液晶,,,这中间会有一些延时,,我怎么弄才不要这个延时呢?

2、明白了
3、这样理解就可以解释我那个现象了。

再次感谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-16 01:13:27 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:1、低优先级的任务正在使用液晶,高优先级的任务在中断后获得了消息,它要使用液晶,这时互斥信号量只是把低优先级任务的优先级暂时提高,低优先级任务使用完液晶后,高优先级任务才使用液晶,,,这中间会有一些延时,,我怎么弄才不要这个延时呢?

2、明白了
3、这样理解就可 .. (2016-03-15 11:53) 
你的这个是800ms和1s刷新一次,影响应该很小的,另外就是显示显示屏刷个数据速度还是非常快的。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-17 22:30:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的这个是800ms和1s刷新一次,影响应该很小的,另外就是显示显示屏刷个数据速度还是非常快的。 (2016-03-16 01:13) 
嗯,已经改了,昨天晚上测试了一个晚上,系统跑的很稳定,暂时没出问题。


顺便问个问题:nRF905的data rate在GFSK时是100kbps,为什么又说有效的符号率是50kbps呢

905的速度到底是多少呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-18 09:49:11 | 显示全部楼层
以官方手册为准:
1.png
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-18 14:43:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:
以官方手册为准:



这个也是官方数据手册中写的呢,,,,,,,这手册怎么前后矛盾呢
55555.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-18 15:11:25 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:这个也是官方数据手册中写的呢,,,,,,,这手册怎么前后矛盾呢


....... (2016-03-18 14:43)
不矛盾,看第二小段。有效值50kbps

你这个地方只是手册在讲解。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-18 15:59:52 | 显示全部楼层

回 eric2013 的帖子

eric2013:不矛盾,看第二小段。有效值50kbps

你这个地方只是手册在讲解。
 (2016-03-18 15:11) 
嗯,第二段说有效的符号率是50K


最近在弄Si4438和905的通信,给4438配的数据速率只能配100K,配50K二者无法通信。

刚开始一直设置的50,一直不通,最后看到了100K,后才通了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-3-18 21:49:41 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:嗯,第二段说有效的符号率是50K


最近在弄Si4438和905的通信,给4438配的数据速率只能配100K,配50K二者无法通信。
....... (2016-03-18 15:59) 
那应该就是100Kbps。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-3-19 17:38:26 | 显示全部楼层

回 eric2013 的帖子

eric2013:那应该就是100Kbps。 (2016-03-18 21:49) 
嗯的

谢谢硬汉哥
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-11 21:16:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:那应该就是100Kbps。 (2016-03-18 21:49) 
@eric2013  
呼叫硬汉哥,能否帮看看下面这个帖子23楼以后的观点是否正确?ucos-II任务调度到底怎么个抢占或调度呢?谢谢

http://www.openedv.com/thread-73702-1-1.html
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-11 22:08:56 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:

@eric2013  
呼叫硬汉哥,能否帮看看下面这个帖子23楼以后的观点是否正确?ucos-II任务调度到底怎么个抢占或调度呢?谢谢

http://www.openedv.com/thread-73702-1-1.html
高优先级任务抢占低优先级任务主要发生在三个时刻,
1. 是滴答定时器中断退出时的检测是否有高优先级任务就绪并执行任务切换。
2. 滴答定时器中断以外的中断退出时做检测是否有高优先级任务就绪并执行任务切换。
3. 高优先级任务由于信号量,消息邮箱等原因被挂起,通过低优先级任务将其唤醒时。
------------------------------------------------------------------------------------------------------------
其余时刻基本不存在高优先级任务就绪的情况,只要有就绪的地方,在源码里面基本都会做调度检测,
看是否需要执行任务切换。
23楼以后的问题的关键点就在所有任务执行完了,提出的假设中高优先级任务就绪了,高优先级任务怎么就绪的?
是什么让他就绪的?,这样就跟上面3点呼应上了,如果是上面三种情况会立即执行切换。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-12 09:51:42 | 显示全部楼层

回 eric2013 的帖子

eric2013:高优先级任务抢占低优先级任务主要发生在三个时刻,
1. 是滴答定时器中断退出时的检测是否有高优先级任务就绪并执行任务切换。
2. 滴答定时器中断以外的中断退出时做检测是否有高优先级任务就绪并执行任务切换。
3. 高优先级任务由于信号量,消息邮箱等原因被挂起,通过低优先级 .. (2016-05-11 22:08) 
谢谢硬汉哥的经典回答。

那这么说来,高优先级任务就绪会马上执行,不会有一个滴答定时器间隔的延时了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-12 10:02:43 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:谢谢硬汉哥的经典回答。

那这么说来,高优先级任务就绪会马上执行,不会有一个滴答定时器间隔的延时了? (2016-05-12 09:51) 
当前还没有想到那种执行情况会造成这种现象。从uCOS的实现机制上面来看,基本是这样的,只要就绪就会让其马上得到执行。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-12 11:35:23 | 显示全部楼层

回 eric2013 的帖子

eric2013:

高优先级任务抢占低优先级任务主要发生在三个时刻,
1. 是滴答定时器中断退出时的检测是否有高优先级任务就绪并执行任务切换。
2. 滴答定时器中断以外的中断退出时做检测是否有高优先级任务就绪并执行任务切换。
3. 高优先级任务由于信号量,消息邮箱等原因被挂起,通过低优先级任务将其唤醒时。
.......
硬汉哥:下面的这种情况怎么办

如果高优先级的任务是通过获得信号量来继续运行的,高优先级任务现在挂起了,低优先级任务正在运行,突然某中断发生了,中断中post了高优先级任务的信号量。

情况一:调用了OSIntEnter,但是没有调用OSIntExit
  1. void xx_IRQHandler(void)
  2. {
  3.   OS_ENTER_CRITICAL();
  4.   OSIntEnter();
  5.   OS_EXIT_CRITICAL();
  6.   
  7.   ......
  8. OSSemPost(xx);
  9. }
复制代码
post函数中有任务调度,但是在中断中调用了OSIntEnter,OSIntNesting不为0,故没有做任务切换,中断中程序继续执行,但是程序最后没有调用OSIntExit函数,故程序回到了低优先级任务那里。这样的话,这个高优先级任务是不是就被延时执行了?

情况二:中断中没有调用OSIntEnter,也没有调用OSIntExit
  1. void xx_IRQHandler(void)
  2. {
  3.   
  4.   ......
  5.   OSSemPost(xx);
  6.   
  7. }
复制代码
post函数中有任务调度,中断中没调用OSIntEnter,OSIntNesting等于0,任务做了切换。这种情况就像是一个任务打断了【嵌套了】一个中断的执行,可以这样理解吗?

正确的写法好像是这样的:
  1. void xx_IRQHandler(void)
  2. {
  3.   OS_ENTER_CRITICAL();
  4.   OSIntEnter();
  5.   OS_EXIT_CRITICAL();
  6.   
  7.   ......
  8.   OSSemPost(xx);
  9.   
  10.   OSIntExit();
  11. }
复制代码
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-12 11:36:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:当前还没有想到那种执行情况会造成这种现象。从uCOS的实现机制上面来看,基本是这样的,只要就绪就会让其马上得到执行。 (2016-05-12 10:02) 
嗯,这样设计就符合/满足实际需要。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-12 11:45:51 | 显示全部楼层

回 小狐狸 的帖子

小狐狸:

硬汉哥:下面的这种情况怎么办

如果高优先级的任务是通过获得信号量来继续运行的,高优先级任务现在挂起了,低优先级任务正在运行,突然某中断发生了,中断中post了高优先级任务的信号量。

.......
uCOS-III或者II的规范中断写法:
12_58_3e0d759c4d2762f.png
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-12 11:58:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:

uCOS-III或者II的规范中断写法:

就是不按照规范写的情况下,按我说的情况1、2会怎么样呢?
会出现我说的任务延时呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-12 12:08:31 | 显示全部楼层
1. 情况一,会将中断级任务切换关闭调用,因为有中断嵌套,最有退出到最后一级中断嵌套时才会执中断级任务切换功能
2 .情况二, 对
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2016-5-12 12:08:46 | 显示全部楼层
1. 情况一,会将中断级任务切换关闭调用,因为有中断嵌套,最有退出到最后一级中断嵌套时才会执中断级任务切换功能
2 .情况二, 对
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
 楼主| 发表于 2016-5-12 13:08:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:
1. 情况一,会将中断级任务切换关闭调用,因为有中断嵌套,最有退出到最后一级中断嵌套时才会执中断级任务切换功能
2 .情况二, 对
谢谢,明白了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 01:12 , Processed in 0.066052 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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