4293|7

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

向大家请教一下uc/os-II多任务的运行机制? [复制链接]

有一个如下的uc/os-II源代码,就是采用信号量机制使两个任务共享一个串口com1,去打印一条字符串。
[code]


#include "config.h"

#define        Task0StkLengh        64              // Define the Task0 stack length 定义用户任务0的堆栈长度
#define        Task1StkLengh        64              // Define the Task1 stack length 定义用户任务1的堆栈长度

OS_STK        Task0Stk [Task0StkLengh];       // Define the Task0 stack 定义用户任务0的堆栈
OS_STK        Task1Stk [Task1StkLengh];       // Define the Task1 stack 定义用户任务1的堆栈

OS_EVENT     *UART0_Sem;


void         Task0(void *pdata);                            // Task0 任务0
void         Task1(void *pdata);                            // Task1 任务1

int main (void)
{
        OSInit ();                                                                                                                                                                                       
        OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 2);               
        OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], 3);
    UART0_Sem = OSSemCreate(1);
        OSStart ();
        return 0;                                                                                                                       
}

/************************************************************************************
** Function name: Task0
** Descriptions:  从UART0输出字符串"Task0 is running!"
************************************************************************************/
void Task0        (void *pdata)
{   uint8 err;

        pdata = pdata;
        TargetInit ();
       
        while (1)
        {
        OSSemPend(UART0_Sem, 0, &err);
        UART_SendStr("Task0 is running!\r\n");
        OSTimeDly(OS_TICKS_PER_SEC);
        OSSemPost(UART0_Sem);
        }
}

/************************************************************************************
** Function name: Task1
** Descriptions:  从UART0输出字符串"Task1 is running!"
************************************************************************************/
void Task1        (void *pdata)
{   uint8 err;  

        pdata = pdata;
       
        while (1)
        {
        OSSemPend(UART0_Sem, 0, &err);
        UART_SendStr("Task1 is running!\r\n");
        OSTimeDly(OS_TICKS_PER_SEC);
        OSSemPost(UART0_Sem);
        }
}


[code]

这段代码我的理解如下:

按照uc/os-II的任务调度机制,当执行OSStart ();去启动多任务的时候,task0会首先运行。
task0第一次去申请信号量时成功,会占用串口1打印出Task0 is running!
此后调用系统延时函数,按照系统延时函数的功能,该函数会把task0任务移出就绪表,之后
进行一次任务级的任务切换。task1将处于运行态,所以task1将去申请信号量,由于task0在未释放
信号量之前调用了 OSTimeDly(OS_TICKS_PER_SEC);使自己挂起了。task1申请失败,将自己插入
信号量等待队列中,那么此时task0和task1处于了死锁状态了。这时候只剩下空闲任务在运行了。

------------------------------------------------------------------------

但是参考书上给出了运行结果将是task0和task1两个任务无规律的执行,每一次打印出
一条关于自己信息的完整字符串!

请问一下,这个代码到底是怎么样运行的?
谢谢!

另外问一个题外话,在发帖的时候怎么编辑源代码格式?

最新回复

尽信书,不如无书。。。。。 尤其是现在国内的书。。。。。。。  详情 回复 发表于 2010-5-20 20:43
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
题外话能回答,技术的回答不上。
编辑的时候从编辑框的上方插入源代码,选择相应的语言列别就可以。
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
自己顶啊!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
Task0运行 -> 得到UART0_Sem->打印->挂起->Task1运行->不能得到UART0_Sem,挂起->idletask运行
->Task0定时时间到,运行,post信号量->Task0 得到UART0_Sem->。。。。。
你的代码有问题。task1会饿死。

OSSemPend(UART0_Sem, 0, &err);
UART_SendStr("Task0 is running!\r\n");
OSSemPost(UART0_Sem);
OSTimeDly(OS_TICKS_PER_SEC);
改成这样的顺序试试。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
我看不错,学习.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 ymhsss 的回复:
Task0运行 -> 得到UART0_Sem->打印->挂起->Task1运行->不能得到UART0_Sem,挂起->idletask运行
->Task0定时时间到,运行,post信号量->Task0 得到UART0_Sem->。。。。。
你的代码有问题。task1会饿死。

OSSemPend(UART0_Sem, 0, &err);
UART_SendStr("Task0……


我也认为代码应该像你的这样编写,共享串口打印就相当于进入了临界区。
但是书上是那样编写的,所以我才怀疑书上搞错了。
因为按照书上的编写Task0和Task1会死锁!
Thank you!
 
 
 

回复

71

帖子

1

TA的资源

一粒金砂(初级)

7
 
MARK,学习了
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
尽信书,不如无书。。。。。

尤其是现在国内的书。。。。。。。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表