要找资料,官网是最好的地方,FreeRTOS的官网是www.freertos.org。
FreeRTOS-Plus 文件夹
CLI、FAT、Trace 等等。就系统本身而言,和 FreeRTOS里面的一模一样的,所以我们如果只是学习 FreeRTOS 这个系统的话,FreeRTOS-Plus 就没必要看了。
一个任务其实就是一个函数+控制块。调度程序根据CPU的时间片,去分配给不同的任务。比如当前三个任务。ble任务,app_task1任务,app_task2任务。来回的入栈出栈切换。
时间片1 ble任务 入栈---执行---同步任务控制块状态-----出栈
时间片2 app_task1任务 入栈---执行---同步任务控制块状态-----出栈
时间片3 app_task2任务 入栈---执行---同步任务控制块状态-----出栈
时间片4 app_task1任务 入栈---执行---同步任务控制块状态-----出栈
函数xTaskCreateStatic形式如下
TaskHandle_t xTaskCreateStatic(TaskFunction_t pxTaskCode, const char *const pcName, const <error-type> ulStackDepth, void *const pvParameters, UBaseType_t uxPriority, <error-type> *const puxStackBuffer, StaticTask_t *const pxTaskBuffer)
调用的函数形式。看着好复杂。
入参(任务函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)
1.调用的循环任务
//任务1----
#define TASK1_NAME "app1"
#define TASK1_STACK_SIZE 200 //栈区大小
#define TASK1_PRIORITY configTIMER_TASK_PRIORITY-2 //第二优先级
static StackType_t app_task1_stack[TASK1_STACK_SIZE];//任务栈全局静态变量
static StaticTask_t app_task1_buf;//任务控制块
static void app_task1(void *param)
{
while(1)
{
//任务
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
}
}
2.传参
(任务入口函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)
xTaskCreateStatic(app_task1,TASK1_NAME,TASK1_STACK_SIZE,NULL,TASK1_PRIORITY,app_stack1,&app_task1_buf);
3. 启动调度
vTaskStartScheduler();
xReturn = xTaskCreate( (TaskFunction_t )AppTaskCreate, /*任务入口函数 */
(const char* )"AppTaskCreate", /* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )&AppTaskCreate_Handle); /* 任务控制块指针 */
1.调用的循环任务
//任务1----
#define TASK2_NAME "app2"
#define TASK2_STACK_SIZE 200 //栈区大小
#define TASK2_PRIORITY configTIMER_TASK_PRIORITY-2 //第二优先级
static StaticTask_t app_task2_buf;//任务控制块
static void app_task2(void *param)
{
while(1)
{
//任务
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
}
}
2.传参
(任务入口函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)
xTaskCreateStatic(app_task2,TASK2_NAME,TASK2_STACK_SIZE,NULL,TASK2_PRIORITY,&app_task1_buf);
3. 启动调度
vTaskStartScheduler();
#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )
1.ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
pdTRUE,这导致接收任务的通知值在ulTaskNotifyTake()返回之前被清除为零
2.xTaskNotifyTake
2.xTaskNotifyGive( xTask2 );
用于向一个任务发送通知,并将对方的任务通知值加 1
3.xTaskNotify
4.xTaskNotifyWait