历史上的今天
今天是: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,
上一篇:UCOSIII时间片轮转调度器
下一篇:UCOIII中任务的调度和切换
史海拾趣
|
1 引言 20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件 ...… 查看全部问答> |
|
终于系统和BIOS都跑起来了!其他都正常,但是WINCE启动后,桌面右键点击后或出现右键的弹出菜单“刷新、新建等”,当出现这个菜单后不对系统做任何动作,大约30S后,发现菜单的焦点会不断从上滚动到下,速度很快,感觉好像使用了键盘下键,几秒钟 ...… 查看全部问答> |
|
各位大侠,帮忙看一下,为什么我的ADC_DATA里面没有数据啊?而且有的时候串口都不发送数据了啊 #include void main() { //单片机系统初始化 C_F=0;//放电控制 ON=0;//充电电流控制 Iset ...… 查看全部问答> |
|
我做了块SIM300的GPRS的模块,遇到下述问题: 连接UDP可以正常连接,而且也能正确收发数据。但是TCP链接不上,用PC机的串口操作如下所示: UDP操作 1. AT 2. ...… 查看全部问答> |
|
目前我用430的硬件IIC通信,采用主发送、从接收方式,就是一个单片机先采用主机方式发送数据,完后处于从接收模式;另一个单片机也如此,不知道这个方法有没有什么问题? 目前遇到的问题是:主发送一次后变为从方式,从接收后变为主方式返回数据, ...… 查看全部问答> |




