task.h-04 TASK CREATION API

来源:互联网 发布:sql回退 编辑:程序博客网 时间:2024/05/17 08:53
Code:
  1. #define xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask)    xTaskGenericCreate( (pvTaskCode), (pcName), (usStackDepth), (pvParameters), (uxPriority), (pxCreatedTask), (NULL), (NULL) ))  

创建一个新的task,并加入到ready to run的task list中。
xTaskCreate()只能被用来创建访问微控制器内部内存映射不受限制的任务。包括MPU支持的系统可以选择使用xTaskCreateRestriced()创建一个MPU受约束的任务。

@param pvTaskCode 指向入口函数的指针。task必须以非return的形式实现,比如无限循环。

@param pcName task的一个描述性的名字。主要被用于调试。名字的最大长度限制由tskMAX_TASK_NAME_LEN定义,默认的是16。

@param usStackDepth 这个大小是任务堆指定的作为堆可以控制的变量的数量,不是bytes的数量。例如,如果堆是16位宽,而usStackDepth被定义为100,那么200个bytes被分配给堆作为存储使用。

@param pvParameters 指针,被用作新创建的任务的参数。

@param uxPriority 优先级,确定哪一个任务应当被运行。包含MPU的系统可以有选择的创建task,在特权模式下,通过设置priority参数的portPRIVILEGE_BIT位。例如,创建一个有优先级的任务,优先级为2,uxPriority参数应该被设置为(2|portPRIVILGE_BIT)。

@param pvCreatedTask 用来传回一个句柄,可以引用这个创建的task。

@return pdPASS 如果task被成功创建,并且加入到ready to run列表中,返回pdPASS,否则返回错误代码,定义在errors.h中。

用例:

Code:
  1. void vTaskCode(void *pvParameters)   
  2. {   
  3.     for (;;) {   
  4.         //Task code goes here.   
  5.     }   
  6. }   
  7.   
  8. //Function that create a task   
  9. void vOtherFunction(void)   
  10. {   
  11.     static unsigned char ucParameterToPass;   
  12.     xTaskHandle xHandle;   
  13. //创建任务,存储句柄。注意传递的参数ucParameterToPass必须存在,在task的生命周期内,因此在这种情况下声明为static。如果它仅是一个automatic的堆变量,它很可能就不存在了,或者至少被占用了,当新的task尝试去访问它的时候。   
  14.     xTaskCreate(vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDELE_PRIORITY, &xHandle);   
  15.     //使用句柄来删除任务   
  16.     vTaskDelete(xHandle);   
  17. }  

下面是另外一个可以创建任务的函数宏

Code:
  1. #define xTaskCreateRestricted(x, pxCreatedTask) xTaskGenericCreate( ((x)->pvTaskCode), ((x)->pcName), ((x)->usStackDepth), ((x)->pvParameters), ((x)->uxPriority), (pxCreatedTask), ((x)->puxStackBuffer), ((x)->xRegions) )  

这个函数只能在实现了MPU的系统上使用。创建一个新的任务并将它加入到ready to run的任务列表中。函数参数定义了内存区域和分配给任务的相关的访问权限。

@param pxTaskDefinition指针指向一个结构体,结构体包含了普通的xTaskCreate()参数的每一个成员,加上一个可选的stack buffer和内存区域定义。

@param pxCreatedTask用来传回一个句柄,用来引用创建的任务。

@return pdPASS成功返回这个否则产生个错误代码。

举例:

Code:
  1. //创建一个xTaskParameters结构体,定义了要被创建的任务   
  2. static const xTaskParameters xCheckTaskParameters = {   
  3.     vATask, //pvTaskCode 实现任务的函数   
  4.     "ATask"//pcName 任务的名字   
  5.     100, //usStackDepth 堆大小   
  6.     NULL, //pvParameters 作为函数参数传递给任务函数   
  7.     (1UL | portPRIVILEGE_BIT), //uxPriority 任务优先级   
  8.     cStackBuffer, //puxStackBuffer 用作任务堆的缓冲区   
  9.     // xRegions 为了任务访问分配三个独立的内存区域,使用适当的访问权限,不同的处理器具有不同的内存对齐要求   
  10.     {      //Base address      Length   Parameters   
  11.         { cReadWriteAaary,    32,    portMPU_REGION_READ_WRITE},   
  12.         { cReadOnlyArray,      32,    portMPU_REGION_READ_ONLY},   
  13.         { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE}   
  14.     }   
  15. };   
  16.   
  17. int main(void)   
  18. {   
  19.     xTaskHandle xHandle;   
  20. //根据上面定义的结构体创建一个任务。需要任务句柄,例子中没有用到。   
  21.     xTaskCreateRestricted(&xRegTest1Parameters, &xHandle);   
  22. //开始调度   
  23.     vTaskStartScheduler();   
  24. //如果没有足够的内存来创建idle进程,将会执行到这儿。   
  25.     for(;;);   
  26. }