portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,const signed portCHAR * const pcName,unsigned portSHORT usStackDepth,void *pvparameters.unsigned portBASE_TYPE uxPriority,xTaskHandle *pxCreatedTask);
函数参数描述:
pvTaskCode:是一个指向任务的实现函数的指针。
pcName:具有描述性的任务名。
usStackDepth:用于告诉内核为它分配多大的栈空间,一般通过定义常量来决定空闲任务的栈空间大小。
pvParameters:接受一个指向void 的指针(void *).pvParameters的值是传递到任务中的值。
uxPriority:任务执行优先级
pxCreatedTask:用于传出任务的句柄。
返回值:1.pdTRUE创建成功。2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
内存堆空间创建不足
vTaskStartScheduler();
for(;;);
void vTaskEndScheduler ( void )
挂起:vTaskSuspend(); 让一个任务进入挂起状态
唤醒:vTaskResume() 或 vTaskResumeFromISR(); 唤醒任务
FreeRTOSConfig.h 中的INCLUDE_vTaskSuspend 为1
taskYIELD();
通知调度器现在就切换到其他任务,而不必等到本任务的时间片耗尽。
void vTaskDelay(portTickType xTicksToDelay);
函数形参描述:
xTicksToDelay:延迟多少个心跳周期。
常数portTICK_RATE_MS用来将毫秒为单位的时间值转换为以心跳周期为单位的时间值
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelay=1,这个函数才能用
void vTaskDelayUntil(portTickType * pxpreviousWakeTime,portTickType xTimeIncrement);
函数形参描述:
pxpreviousWakeTime:保存了任务上一次离开阻塞态(被唤醒)的时刻,。这个时刻被用作一个参考点来计算该任务下一次离开阻塞态的时刻。只需第一次将其初始化,之后将自动更新(xLastWakeTime = xTaskGetTickCount())。
xTimeIncrement:用于实现某个任务以固定频率周期性执行,常量portTICK_RATE_MS将毫秒转换为心跳周期。
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelayUntil=1,这个函数才能用
void vApplicationIdleHook(void);
改变优先级
void vTaskPrioritySet(xTaskHandle pxTask,unsigned portBASE_TYPE uxNewPriority);
函数参数描述:
pxTask:任务句柄。
uxNewPriority:任务优先级设置
查询优先级
unsigned portBASE_TYPE uxTaskPriorityGet(xTaskHandle pxTask);
pxTask:被查询任务的句柄。
void vTaskDelete(xTaskHandle pxTaskToDelete);
pxTaskDelete:被删除的任务句柄。
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelete=1,函数才能使用
xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize );
函数参数描述:
uxQueueLength:队列能够存储的最大单元数目
uxItemSize:队列中数据单元的长度。
返回值:NULL表示没有足够的堆空间分配给队列,非NULL表示队列创建成功,返回值为队列的句柄。
xQueueSendToFront:用于将数据发送到队列首。
portBASE_TYPE xQueueSendToFront( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );
xQueueSendToBack:用于将数据发送队列尾。
xQueueSend()完全等同于xQueueSendToBack().
portBASE_TYPE xQueueSendToBack( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );
函数形参描述:
xQueue:队列的句柄;
pvltemToQueue:发送数据的指针,指针指向将要复制到目标队列中的数据单元。
xTicksToWait:阻塞超时时间。若队列时间已满,这个时间即是任务处于组赛态等待队列空间有效的最长等待时间。若设置为1,将会立即返回。如果把 xTicksToWait 设置为 portMAX_DELAY ,并且在FreeRTOSConig.h 中设INCLUDE_vTaskSuspend 为 1,那么阻塞等待将没有超时限制
返回值:1.pdPASS数据成功发送到队列。2.errQUEUE_FULL队列已满,数据无法写入。
接收到的单元会从队列中删除:
portBASE_TYPE xQueueReceive( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );
接收到的单元不会从队列中删除:
portBASE_TYPE xQueuePeek( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );
函数参数描述:
xQueue:被读队列的句柄。
pvBuffer:接收缓存指针。
xTicksToWait:阻塞超时时间(超时时间设置如发送一样)
返回值:1.pdPASS成功从队列中读到数据。2.errQUEUE_FULL队列已空没有读到数据。
unsigned portBASE_TYPE uxQueueMessagesWaiting(xQueueHandle xQueue);
函数参数描述:
xQueue:被查询队列的句柄。
返回值:当前队列保存的数据单元个数,0表明队列为空。
portBase_TYPE vTaskResumeFromISR (xTaskHandle pxTaskToResum 就绪任务的句柄)
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskSuspendhe 和INCLUDE_xTaskResumeFromISR 都为1,才能使用此函数。
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
函数参数描述:
xSemaphore:创建的信号量
不能在中断服务函数中被调用。
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );
函数参数描述:
xSemaphor:获取得到的信号量
xTicksToWait:阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。(与9.2里面发数据一样)
返回值:1.paPASS成功 2.pdFALSE未获得信号量
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );
函数参数描述:
xSemaphore:给出的信号量
pxHigherPriorityTaskWoken:解除之前为pdFALSE,解除阻塞之后会设置为pdTRUE。
返回值:1.pdPASS调用成功,2.pdFALL如果信号量已经有效,无法给出,则返回pdFAIL。
创建二值信号量以及任务→安装中断服务例程,然后启动调度器
安装中断例程
_dos_setvect(0x82,vExampleInterruptHandler);
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount );
函数参数描述:
uxMaxCount:最大计数值。
uxInitialCount:信号量的初始计数值。事件计数(0),资源管理(uxInitialCount == uxMaxCount)
返回值:NULL堆上内存空间不足,非NULL信号创建成功。
加在队首:
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken );
加在队尾:
portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken )
xQueue:目标队列的句柄。
pvltemToQueue:发送数据的指针。
pxHigherPriorityTaskWoken:从pdFALSE转换到pdTRUE。
返回值:1.pdPASS 2.errQUEUE_FULL
portBASE_TYPE xQueueReceiveFromISR (
xQueueHandle pxQueue, //发送项目的队列句柄
void *pvBuffer, //指向缓冲区的指针,将接收的项目被复制进去
portBASE_TYPE *pxTaskWoken //任务将锁住,等待队列中的可用空间
);
返回值:pdTRUE成功接收,pdFALSE失败
void vQueueAddToRegistry (
xQueueHandle xQueue, //将要添加登记的队列句柄
signed portCHAR *pcQueueName, //为指定的队列命名。 仅仅是文本串,方便调试。
);
void vQueueUnregisterQueue (
xQueueHandle xQueue, //从登记管理处中移出的队列句柄
);
10.4中断嵌套
建立一个全面的中断嵌套模型需要设置configMAX_SYSCALL_INTERRUPT_PRIRITY=3
为比configKERNEL_INTERRUPT_PRIORITY=1更高的优先级。
taskENTER_CRITICAL();//进入临界区
POPTA | = 0x01;
taskEXIT_CRITICAL();//退出临界区
void vTaskSuspendAll(void);
通过调用 vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不
用关中断。如果某个中断在调度器挂起过程中要求进行上下文切换,则个这请求也会被
挂起,直到调度器被唤醒后才会得到执行
portBASE_TYPE xTaskResumeAll( void );
返回值:在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器被唤醒后才会得到执行。如果一个挂起的上下文切换请求在xTaskResumeAll()返回前得到执行,则函数返回 pdTRUE。在其
它情况下,xTaskResumeAll()返回 pdFALSE。
xSemaphoreHandle xSemaphoreCreateMutex( void );
返回值:NULL创建失败 非NULL创建成功
说明:可以使用xSemaphoreTake() 与 xSemaphoreGive() 宏来访问
xSemaphoreHandle xSemaphoreCreateRecursiveMutex ( void )
说明:通过此宏创建的互斥锁可以使用xSemaphoreTakeRecursive()与 xSemaphoreGiveRecursive()
守护任务即为将受到的信息写在标准输出上。中断服务例程中可以安全地使用守护任务提供的服务。使用心跳中断钩子函数用于每200心跳周期输出一个消息。配置如下:
设置 FreeRTOSConfig.h 中的常量configUSE_TICK_HOOK 为 1。
查询指定任务的运行历史中,栈空间还有多少就要溢出。
unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );
函数参数描述:
xTask:任务的句柄
返回值:返回从任务启动执行开始的运行历史中,栈空间具有的小剩余量。这个值即是栈空间使用达到深时的剩下的未使用的栈空间。
在FreeRTOSConfig.h中把configCHECK_FOR_STACK_OVERFLOW设为1或2
钩子函数具体实现:
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );