历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2019年04月25日 | UCOSIII任务创建、删除、挂起和恢复

2019-04-25 来源:eefocus

一、任务的创建


任务创建函数:OSTaskCreate()


void  OSTaskCreate (  OS_TCB          *p_tcb,//指向任务的任务控制块

                                      CPU_CHAR      *p_name,//任务名字

                                  OS_TASK_PTR    p_task,//任务函数名字

                                  void              *p_arg,//传递给任务的参数

                                  OS_PRIO        prio,//任务优先级

                                  CPU_STK         *p_stk_base,//任务堆栈基地址

                                  CPU_STK_SIZE   stk_limit,//任务堆栈深度

                                  CPU_STK_SIZE   stk_size,//任务堆栈大小

                                  OS_MSG_QTY     q_size,//可选消息队列

                                  OS_TICK        time_quanta,//使能时间片轮转调度,默认时钟节拍除以10

                                  void              *p_ext,//指向用户补充的存储区

                                  OS_OPT                opt,//任务的特定选项

                                  OS_ERR          *p_err)//保存错误码

①首先要定义每个任务的优先级、栈大小、任务控制块及堆栈


//任务优先级


#define START_TASK_PRIO         3


//任务堆栈大小    


#define START_STK_SIZE           512


//任务控制块


OS_TCB StartTaskTCB;


//任务堆栈    


CPU_STK START_TASK_STK[START_STK_SIZE];


//任务函数 申明


void start_task(void *p_arg);


②编写主函数,首先是外部功能函数的初始化,然后初始化UCOSIII,再创建开始任务(在创建开始任务之前必须调用进入临界区函数,创建完后还要退出临界区,然后开启UCOIII),创建开始任务的传参既是自己宏定义的一些参数。


int main(void)

 

{

       OS_ERR err;//错误值:都是宏定义,根据对应数值找到返回错误值代表的意思

       CPU_SR_ALLOC();

       delay_init(168);    //时钟初始化

 

       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置

       uart_init(115200);  //串口初始化

       LED_Init();         //LED初始化

 

       OSInit(&err);         //初始化UCOSIII

       OS_CRITICAL_ENTER();//进入临界区

       //创建开始任务

       OSTaskCreate((OS_TCB       * )&StartTaskTCB,         //任务控制块

                             (CPU_CHAR * )"start task",              //任务名字

                 (OS_TASK_PTR )start_task,                      //任务函数

                 (void            * )0,                             //传递给任务函数的参数

                 (OS_PRIO       )START_TASK_PRIO,     //任务优先级

                 (CPU_STK   * )&START_TASK_STK[0],     //任务堆栈基地址

                 (CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位

                 (CPU_STK_SIZE)START_STK_SIZE,             //任务堆栈大小

                 (OS_MSG_QTY  )0,                                //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息

                 (OS_TICK        )0,                                   //当使能时间片轮转时的时间片长度,为0时为默认长度,

                 (void          * )0,                             //用户补充的存储区

                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项

                 (OS_ERR      * )&err);                       //存放该函数错误时的返回值

       OS_CRITICAL_EXIT();     //退出临界区

       OSStart(&err);  //开启UCOSIII

       while(1);

}

③主函数调用创建开始任务函数后就应编写开始任务函数的功能函数,开始任务函数内同样是调用功能函数,原理同上,接着写功能函数所要实现的功能。


//开始任务函数

void start_task(void *p_arg)

{

       OS_ERR err;

       CPU_SR_ALLOC();

       p_arg = p_arg;

 

       CPU_Init();

#if OS_CFG_STAT_TASK_EN > 0u

   OSStatTaskCPUUsageInit(&err);  //统计任务               

#endif

      

#ifdef CPU_CFG_INT_DIS_MEAS_EN          //如果使能了测量中断关闭时间

    CPU_IntDisMeasMaxCurReset(); 

#endif

 

#if   OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候

        //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms

       OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); 

#endif                 

 

       OS_CRITICAL_ENTER(); //进入临界区

       //创建LED0任务

       OSTaskCreate((OS_TCB       * )&Led0TaskTCB,       

                             (CPU_CHAR * )"led0 task",             

                 (OS_TASK_PTR )led0_task,                     

                 (void            * )0,                            

                 (OS_PRIO       )LED0_TASK_PRIO,    

                 (CPU_STK   * )&LED0_TASK_STK[0],      

                 (CPU_STK_SIZE)LED0_STK_SIZE/10,  

                 (CPU_STK_SIZE)LED0_STK_SIZE,       

                 (OS_MSG_QTY  )0,                               

                 (OS_TICK        )0,                                  

                 (void          * )0,                            

                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,

                 (OS_ERR      * )&err);                                                  

       //创建LED1任务

       OSTaskCreate((OS_TCB       * )&Led1TaskTCB,       

                             (CPU_CHAR * )"led1 task",             

                 (OS_TASK_PTR )led1_task,                     

                 (void            * )0,                            

                 (OS_PRIO       )LED1_TASK_PRIO,      

                 (CPU_STK   * )&LED1_TASK_STK[0],      

                 (CPU_STK_SIZE)LED1_STK_SIZE/10,  

推荐阅读

史海拾趣

E-Mark Inc公司的发展小趣事

JKL公司是一家创新型电子企业,专注于研发新能源汽车电子控制系统。为了推动新能源汽车的发展并满足欧洲市场的需求,JKL公司决定对其产品进行E-Mark认证。在认证过程中,JKL公司积极投入研发资源,不断创新技术,提升产品的智能化和安全性。最终,JKL公司的产品成功获得了E-Mark认证,并在欧洲市场得到了广泛应用和认可。这一认证不仅加速了JKL公司新能源汽车技术的市场推广速度,也提升了公司在国际市场的竞争力。

AEMC Instruments公司的发展小趣事

随着产品的不断完善和升级,AEMC Instruments公司开始积极拓展市场。公司加强与国际市场的合作,通过参加国际展会、建立全球分销商网络等方式,将产品推向全球。同时,公司还积极寻求与国际知名企业的合作,共同研发新产品和技术,以进一步提升产品的竞争力。这些举措不仅扩大了公司的市场份额,也提高了公司的国际知名度。

ATO SOLUTION公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。ATO SOLUTION公司始终坚持以质量为核心,建立了严格的质量管理体系。公司从原材料采购到产品生产的每一个环节都进行严格把控,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使公司赢得了客户的信任和口碑,为公司的长期发展奠定了坚实基础。

诚润电子(CHEVRON)公司的发展小趣事

诚润电子深知,一个优秀的团队是企业成功的关键。因此,他们一直致力于打造一支高素质、专业化的团队。公司注重员工的培训和发展,为员工提供广阔的职业发展空间和良好的福利待遇。同时,诚润电子还积极营造一种积极向上的企业文化氛围,让员工在工作中感受到归属感和成就感。这种良好的团队建设机制为诚润电子的持续发展提供了有力的保障。

AMOTECH(阿莫泰克)公司的发展小趣事

在多年的发展中,AMOTECH始终坚持以技术创新为核心竞争力。除了压敏电阻技术的突破外,公司还在多个领域取得了显著成果。例如,在LED照明和传感器领域,AMOTECH通过不断研发和创新,成功在韩国安山建立了第四工厂,进一步提升了公司的技术实力和产能规模。这些技术的不断突破和创新,使得AMOTECH在电子行业中始终保持领先地位。

DEWALT公司的发展小趣事

DEWALT公司非常注重产品品质和用户体验。公司建立了严格的质量控制体系,确保每一件产品都符合高质量标准。同时,DEWALT还积极倾听用户反馈,不断改进产品和服务。这些努力使DEWALT公司的电动工具在市场上获得了广泛认可,并赢得了大量忠实用户。

问答坊 | AI 解惑

DSP和FPGA在汽车电子中的广泛应用

1 引言   20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件 ...…

查看全部问答>

12864液晶屏(急需)

我现在特别需要“12864液晶屏”的详细资料的,知道的发给我增长一些与其相关的知识,谢谢。…

查看全部问答>

有人选C题吗,来点靠谱的方案吧

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 RT 说说也行  …

查看全部问答>

44B0和UDA1341

小弟是初学44B0想学学44B0和UDA1341,那位大哥有他们的原理图和代码,发我一份好吗??谢谢了!!邮箱624195206@qq.com   谢谢!!!…

查看全部问答>

非常奇怪的WINCE启动后现象

终于系统和BIOS都跑起来了!其他都正常,但是WINCE启动后,桌面右键点击后或出现右键的弹出菜单“刷新、新建等”,当出现这个菜单后不对系统做任何动作,大约30S后,发现菜单的焦点会不断从上滚动到下,速度很快,感觉好像使用了键盘下键,几秒钟 ...…

查看全部问答>

锂电池充电的问题 ADC_DATA

各位大侠,帮忙看一下,为什么我的ADC_DATA里面没有数据啊?而且有的时候串口都不发送数据了啊 #include void main() {     //单片机系统初始化     C_F=0;//放电控制     ON=0;//充电电流控制 Iset ...…

查看全部问答>

sim300联网问题

我做了块SIM300的GPRS的模块,遇到下述问题:     连接UDP可以正常连接,而且也能正确收发数据。但是TCP链接不上,用PC机的串口操作如下所示:     UDP操作       1. AT       2. ...…

查看全部问答>

关于IIC通信的问题,大牛来指点一下!

目前我用430的硬件IIC通信,采用主发送、从接收方式,就是一个单片机先采用主机方式发送数据,完后处于从接收模式;另一个单片机也如此,不知道这个方法有没有什么问题? 目前遇到的问题是:主发送一次后变为从方式,从接收后变为主方式返回数据, ...…

查看全部问答>

关于宏定义的问题。

实例代码如下: #define TestDefine  Test1 #ifdef TestDefine == Test2    for(i = 0; i < 10; i++)   {     ...   } #else   for(i = 0; i < 10; i++)  &nb ...…

查看全部问答>