操作系统之进程和线程--uC/os-II实例--建立任务
来源:互联网 发布:瓷砖专用进销存软件 编辑:程序博客网 时间:2024/05/17 09:22
1.建立任务,OSTaskCreate() / OSTaskCreateExt()
- INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
- {
- void *psp;
- INT8U err;
- if (prio > OS_LOWEST_PRIO) { (1)
- return (OS_PRIO_INVALID);
- }
- OS_ENTER_CRITICAL();
- if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { (2)
- OSTCBPrioTbl[prio] = (OS_TCB *)1; (3)
- OS_EXIT_CRITICAL(); (4)
- psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); (5)
- err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); (6)
- if (err == OS_NO_ERR) { (7)
- OS_ENTER_CRITICAL();
- OSTaskCtr++; (8)
- OSTaskCreateHook(OSTCBPrioTbl[prio]); (9)
- OS_EXIT_CRITICAL();
- if (OSRunning) { (10)
- OSSched(); (11)
- }
- } else {
- OS_ENTER_CRITICAL();
- OSTCBPrioTbl[prio] = (OS_TCB *)0; (12)
- OS_EXIT_CRITICAL();
- }
- return (err);
- } else {
- OS_EXIT_CRITICAL();
- return (OS_PRIO_EXIST);
- }
- }
(5) OSTaskCreate()调用OSTaskStkInit(),它负责建立任务的堆栈。OSTaskStkInit()函数返回新的堆栈栈顶(psp),并被保存在任务的0S_TCB中。
(6) 一旦OSTaskStkInit()函数完成了建立堆栈的任务,OSTaskCreate()就调用OSTCBInit(),从空闲的OS_TCB池中获得并初始化一个OS_TCB。
(9) OSTaskCreate()调用OSTaskCreateHook(),OSTaskCreateHook()是用户自己定义的函数,用来扩展OSTaskCreate()的功能。注意,OSTaskCreate()在调用OSTaskCreateHook()时,中断是关掉的,所以用户应该使OSTaskCreateHook()函数中的代码尽量简化,因为这将直接影响中断的响应时间。OSTaskCreateHook()在被调用时会收到指向任务被建立时的OS_TCB的指针。这意味着该函数可以访问OS_TCB数据结构中的所有成员。
(10)(11) 如果OSTaskCreate()函数是在某个任务的执行过程中被调用(即OSRunning置为True),则任务调度函数会被调用来判断是否新建立的任务比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果在多任务调度开始之前(即用户还没有调用OSStart()),新任务就已经建立了,则任务调度函数不会被调用。
用OSTaskCreateExt()函数来建立任务会更加灵活,但会增加一些额外的开销。
- INT8U OSTaskCreateExt (void (*task)(void *pd),
- void *pdata,
- OS_STK *ptos,
- INT8U prio,
- INT16U id,
- OS_STK *pbos,
- INT32U stk_size,
- void *pext,
- INT16U opt)
- { ... }
- 操作系统之进程和线程--uC/os-II实例--建立任务
- ·嵌入式实时操作系统uC/OS-II中的任务管理
- uC/OS-II 学习笔记之:任务的优先级别和任务数
- UC/OS II 任务管理(5)之任务删除、阻塞和恢复
- UC/OS II 任务管理(4)之任务创建
- UC/OS-II 操作系统移植
- 研究uc/os-ii操作系统
- UC/OS-II 操作系统移植
- uc/os-ii操作系统笔记
- UC/OS-II操作系统结构
- uC/OS-II的任务
- uC/OS-II 中的任务
- uc/os-ii统计任务
- uc/os-ii删除任务
- uc/os-ii任务延时
- UC/OS II任务管理
- uC/OS-II 学习笔记之:怎样在uC/OS-II里创建一个任务?
- uC/OS-II 学习笔记之:实时操作系统
- 从迷茫中走出
- tesseract3.0
- 尺度空间理论1
- 原创: Oracle的远程数据库的连接和用户操作 <三>
- plc编程
- 操作系统之进程和线程--uC/os-II实例--建立任务
- 小车循迹前进
- 学习C++的难
- 关于冒泡排序的一些体会
- 时间大小的比较
- 快速列转行
- number2
- JAVA中的位运算
- 转:js怎么样控制打开网页窗口的大小,HTML如何关闭窗口大全(经典+有用+常用)