一、 uCOSII任务封装
1 任务概念
(1)任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。
(2)进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。
(3)线程(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。
另外,大多数的RTOS都采用了基于优先级的可抢占调度算法,如在FreeRTOS、uC/OS-II等,在这此实时操作系统中,任务就是线程。
2 uCOSII任务封装
在ksdk_ucosii_lib库项目下的fsl_os_abstraction.h里,定义了6个任务相关的接口:
osa_status_t OSA_TaskCreate(task_t task, uint8_t *name,uint16_t stackSize,task_stack_t *stackMem,uint16_t priority,task_param_t param,bool usesFloat,task_handler_t *handler);
osa_status_t OSA_TaskDestroy(task_handler_t handler);
osa_status_t OSA_TaskYield(void);
task_handler_t OSA_TaskGetHandler(void);
uint16_t OSA_TaskGetPriority(task_handler_t handler);
osa_status_t OSA_TaskSetPriority(task_handler_t handler, uint16_t priority);
而在fsl_os_abstraction_ucosii.h文件中,进行了具体实现,其中创建任务的函数定义为:
各参数的定义为:
* @param task 具体的任务入口地址
* @param name 任务的名字
* @param stackSize 任务的堆栈大小
* @param stackMem 任务的堆栈内存
* @param priority 任务的优先级
* @param param 传递任务参数的指针
* @param usesFloat 任务是否使用浮点型寄存器
* @param handler 任务句柄指针
二、MAPS-K64中任务的使用
1 Led接口定义
在模板工程下的led.c和led.h文件中,定义Led的控制任务接口
2 全局参数定义
(1)定义优先级及堆栈大小
优先级应该小于5
#define TASK_LED_PRIO 6
#define TASK_LED_STACK_SIZE 2048
(2)定义任务函数及句柄
OSA_TASK_DEFINE(ucosii_led, TASK_LED_STACK_SIZE);
而宏定义在头文件fsl_os_abstraction_ucosii.h中定义如下:
#define OSA_TASK_DEFINE(task, stackSize)
task_stack_t task##_stack[(stackSize)/sizeof(task_stack_t)];
task_handler_t task##_task_handler
这个宏使用记号粘贴操作符##,具体该操作符的使用,可参考:C/C++ 宏中“#"和"##”的用法。
3 主函数
主函数,完成一些初始化工作,并创建一个任务。
4 任务函数
任务函数为一个周期性任务,控制Led的闪烁。
5 效果
MAPS-Dock上的Led在闪烁。
|