|
我有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);
}
谢谢 |
|