共2条
1/1 1 跳转至页
UCOS 请功大家共同讨论学习,UCOS三任务切换程序:
问
#include "config.h"
#define TaskStkLengh 64 // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»³¤¶È
#define UART_BPS 115200 /* ¶¨ÒåͨѶ²¨ÌØÂÊ */
OS_STK TaskStk [TaskStkLengh]; // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»
OS_STK TaskStk1 [TaskStkLengh];
OS_STK TaskStk2 [TaskStkLengh];
OS_EVENT *TASK1;
OS_EVENT *TASK2;
OS_EVENT *TASK3;
//OS_STK TaskStk2 [TaskStkLengh];
void Task0(void *pdata); //Task0 ÈÎÎñ0
void Task1(void *pdata);
void Task2(void *pdata);
uint8 err;
/****************************************************************************
* Ãû³Æ£ºUART0_Ini()
* ¹¦ÄÜ£º³õʼ»¯´®¿Ú0¡£ÉèÖÃΪ8λÊý¾Ý룬1λֹͣ룬ÎÞÆæżУÑ飬²¨ÌØÂÊΪ115200
* Èë¿Ú²ÎÊý£ºÎÞ
* ³ö¿Ú²ÎÊý£ºÎÞ
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1£¬¿ÉÉèÖò¨ÌØÂÊ
Fdiv = (Fpclk / 16) / UART_BPS; // ÉèÖò¨ÌØÂÊ
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // ·¢ËÍÊý¾Ý
while( (U0LSR&0x40)==0 ); // µÈ´ýÊý¾Ý·¢ËÍÍê±Ï
}
int main (void)
{
OSInit();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
TASK1= OSSemCreate(0);
TASK2= OSSemCreate(0);
TASK3= OSSemCreate(0);
TargetInit();
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 ÈÎÎñ0
********************************************************************************************************/
void Task0 (void *pdata)
{
UART0_Ini();
OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 10); /* ´´½¨ÈÎÎñ */
OSTaskCreate(Task2, (void *)0, &TaskStk2[TaskStkLengh-1], 12); /* ´´½¨ÈÎÎñ */
OSSemPost(TASK1);
for (;;)
{
OSSemPend(TASK1,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x01);
OSSemPost(TASK2);
}
}
}
/*********************************************************************************************************
** Task1 ÈÎÎñ1
********************************************************************************************************/
void Task1 (void *pdata)
{
UART0_Ini();
for (;;)
{
OSSemPend(TASK2,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x02);
OSSemPost(TASK3); //将此句改为OSSemPost(TASK2); 能够 交替输出1,2,1,2...
}
}
}
void Task2 (void *pdata)
{
UART0_Ini();
for (;;)
{
OSSemPend(TASK3,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x03);
OSSemPost(TASK1);
}
}
}
去掉Task2,其它2任务执行正常,交替输出1,2,1,2...
加上Task2,只能输出1,2.
请高手帮忙,也请大家共同讨论学习.
答 1: 更正://将此句改为OSSemPost(TASK1); 能够 交替输出1,2,1,2... 答 2: re在OS_CFG.H中把OS_MAX_EVENTS设为3了吗? 答 3: 看看是不是超时了!看看task2的OSSemPend(TASK3,10,&err);把超时时间改长点看看 答 4: 以上2位大哥说的都试了,结果不变. 答 5: re检查一下
int main (void)
{
OSInit();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
TASK1= OSSemCreate(0);
TASK2= OSSemCreate(0);
TASK3= OSSemCreate(0);
TargetInit();
OSStart ();
return 0;
}
中 OSSemCreate、OSTaskCreate 的返回值,
另,你为什么老去初始化 UART0_Ini(); 呢 答 6: 已搞定,多谢以上大侠. 答 7: 楼主应该写出问题出在哪里,解决方法,方便后来人。也是对关注者的一个交待。 答 8: 响应深思版主要求,确实忘了说的结果:问题出在任务的中断优先级上,需要改最低优先级培植,否则TASK2的优先级被系统占用.
不知这样解释大家能否明白. 答 9: 大家认真研究这个例子后:大家认真研究这个例子后,应该能对最简单的多任务切换有个了解,尤其是信号量的学习.
欢迎共同学习,共同进步,同是也希望能继续得到大家的帮助!
#define TaskStkLengh 64 // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»³¤¶È
#define UART_BPS 115200 /* ¶¨ÒåͨѶ²¨ÌØÂÊ */
OS_STK TaskStk [TaskStkLengh]; // ¶¨ÒåÓû§ÈÎÎñ0µÄ¶ÑÕ»
OS_STK TaskStk1 [TaskStkLengh];
OS_STK TaskStk2 [TaskStkLengh];
OS_EVENT *TASK1;
OS_EVENT *TASK2;
OS_EVENT *TASK3;
//OS_STK TaskStk2 [TaskStkLengh];
void Task0(void *pdata); //Task0 ÈÎÎñ0
void Task1(void *pdata);
void Task2(void *pdata);
uint8 err;
/****************************************************************************
* Ãû³Æ£ºUART0_Ini()
* ¹¦ÄÜ£º³õʼ»¯´®¿Ú0¡£ÉèÖÃΪ8λÊý¾Ý룬1λֹͣ룬ÎÞÆæżУÑ飬²¨ÌØÂÊΪ115200
* Èë¿Ú²ÎÊý£ºÎÞ
* ³ö¿Ú²ÎÊý£ºÎÞ
****************************************************************************/
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1£¬¿ÉÉèÖò¨ÌØÂÊ
Fdiv = (Fpclk / 16) / UART_BPS; // ÉèÖò¨ÌØÂÊ
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // ·¢ËÍÊý¾Ý
while( (U0LSR&0x40)==0 ); // µÈ´ýÊý¾Ý·¢ËÍÍê±Ï
}
int main (void)
{
OSInit();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
TASK1= OSSemCreate(0);
TASK2= OSSemCreate(0);
TASK3= OSSemCreate(0);
TargetInit();
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 ÈÎÎñ0
********************************************************************************************************/
void Task0 (void *pdata)
{
UART0_Ini();
OSTaskCreate(Task1, (void *)0, &TaskStk1[TaskStkLengh-1], 10); /* ´´½¨ÈÎÎñ */
OSTaskCreate(Task2, (void *)0, &TaskStk2[TaskStkLengh-1], 12); /* ´´½¨ÈÎÎñ */
OSSemPost(TASK1);
for (;;)
{
OSSemPend(TASK1,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x01);
OSSemPost(TASK2);
}
}
}
/*********************************************************************************************************
** Task1 ÈÎÎñ1
********************************************************************************************************/
void Task1 (void *pdata)
{
UART0_Ini();
for (;;)
{
OSSemPend(TASK2,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x02);
OSSemPost(TASK3); //将此句改为OSSemPost(TASK2); 能够 交替输出1,2,1,2...
}
}
}
void Task2 (void *pdata)
{
UART0_Ini();
for (;;)
{
OSSemPend(TASK3,10,&err);//»ñÈ¡·¢Ë͵ÄȨÁ¦
if(err==OS_NO_ERR)
{
UART0_SendByte(0x03);
OSSemPost(TASK1);
}
}
}
去掉Task2,其它2任务执行正常,交替输出1,2,1,2...
加上Task2,只能输出1,2.
请高手帮忙,也请大家共同讨论学习.
答 1: 更正://将此句改为OSSemPost(TASK1); 能够 交替输出1,2,1,2... 答 2: re在OS_CFG.H中把OS_MAX_EVENTS设为3了吗? 答 3: 看看是不是超时了!看看task2的OSSemPend(TASK3,10,&err);把超时时间改长点看看 答 4: 以上2位大哥说的都试了,结果不变. 答 5: re检查一下
int main (void)
{
OSInit();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);
TASK1= OSSemCreate(0);
TASK2= OSSemCreate(0);
TASK3= OSSemCreate(0);
TargetInit();
OSStart ();
return 0;
}
中 OSSemCreate、OSTaskCreate 的返回值,
另,你为什么老去初始化 UART0_Ini(); 呢 答 6: 已搞定,多谢以上大侠. 答 7: 楼主应该写出问题出在哪里,解决方法,方便后来人。也是对关注者的一个交待。 答 8: 响应深思版主要求,确实忘了说的结果:问题出在任务的中断优先级上,需要改最低优先级培植,否则TASK2的优先级被系统占用.
不知这样解释大家能否明白. 答 9: 大家认真研究这个例子后:大家认真研究这个例子后,应该能对最简单的多任务切换有个了解,尤其是信号量的学习.
欢迎共同学习,共同进步,同是也希望能继续得到大家的帮助!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |