【基于FreeRTOS的STM32F103系统】简介及官方文件移植
【基于FreeRTOS的STM32F103系统】编写FreeRTOS程序
【基于FreeRTOS的STM32F103系统】内存管理及任务调度
【基于FreeRTOS的STM32F103系统】Heap_4内存管理机制程序详解
【基于FreeRTOS的STM32F103系统】移动底盘程序优化
前面简单介绍了FreeRTOS和如何将它简单的移植到STM32F1上,这篇介绍移植完成后,我们如何创建任务,并利用FreeRTOS的多任务机制优化我们的程序。
创建任务时使用的函数如下:
- BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函数指针,任务函数
- const char * const pcName, //任务的名字
- const configSTACK_DEPTH_TYPE usStackDepth,//栈大小,单位为word,10表示40字节
- void * const pvParameters, //调用任务函数时传入的参数
- UBaseType_t uxPriority, //优先级
- TaskHandle_t * const pxCreatedTask );//任务句柄,以后使用它来操作这个任务
参数说明:
实例:
- void Task1Function(void * param)
- {
- while (1)
- {
- printf("1");
- }
- }
- void Task2Function(void * param)
- {
- while (1)
- {
- printf("2");
- }
- }
- xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);
- xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);
开启任务调度:
vTaskStartScheduler(); //开启任务调度
结果:
删除任务使用的函数如下:
void vTaskDelete( TaskHandle_t xTaskToDelete );
参数说明:
实例:
- void vTask1( void *pvParameters )
- {
- const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );
- BaseType_t ret;
- /* 任务函数的主体一般都是无限循环 */
- for( ;; )
- {
- /* 打印任务的信息 */
- printf("Task1 is running\r\n");
- ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle );
- if (ret != pdPASS) printf("Create Task2 Failed\r\n");
- // 如果不休眠的话, Idle任务无法得到执行
- // Idel任务会清理任务2使用的内存
- // 如果不休眠则Idle任务无法执行, 最后内存耗尽
- vTaskDelay( xDelay100ms );
- }
当创建任务并开始任务调度后,所有任务都处于Ready就绪状态,系统随机挑选一个任务Running,正在执行的任务可以使用vTaskSuspend函数使自己进入挂起状态(传入参数NULL或自己的句柄),也可以使其他任务进入挂起状态(传入参数为需要挂起任务的句柄),进入暂停状态后,需要在别的任务执行过程中调用vTaskResume函数该任务才会重新进入Ready状态;
在任务执行过程中,需要等待某个函数或事件的发生,则进入挂起状态(Baocked),当等待的事件(可能是中断或某个任务)发生后该任务才会恢复Ready状态。
关于任务简单写这些,后面进行内存管理、堆栈、队列等的介绍