实践调解
几乎全部的Freertos的定义都在freerosconfig.h的文件里面,想要改的话直接用这个函数就行
源码包官网:FreeRTOS™ - FreeRTOS™
代码托管网站 : https://sourceforge.net/projects/freertos/files/FreeRTOS/ (已下载)
Own_Compile:
①LED---compile:
- TaskFunction_t pxTaskCode为什么引用的是前面的而不是后面的结构体名称:
因为前面的是函数的结构体定义,后面的是函数指针,所以要把函数名放在后面的函数指针的位置,才会执行的时候调到那个函数的执行位置
(同说法:TaskFunction_t pxTaskCode为一个函数指针,指向任务的执行函数 ,而TaskFunction_t 实际是一个类型定义typedef void (*TaskFunction_t)( void * );)
- 任务句柄就是一个地址,所以在函数具体填写的时候需要加一个&来取这个函数,不过定义的时候直接用TaskHandle_t 告诉用户有这个句柄可以查,与任务是绑定的
- const uint16_t usStackDepth:此参数是用于设置任务的堆栈大小, 每个任务有一个自己的堆栈,用于任务切换时保存上下文; 堆栈大小不是由usStackDepth直接来表示,在真正分配堆栈空间时, 堆栈的实际大小为 sizeof( StackType_t )*usStackDepth;
- 若StackType_t 为4字节即堆栈大小为4*usStackDepth;对于栈空间,实际申请的栈大小为usStackDepth*sizeof(StackType_t),例如32位单片机上一个StackType_t占4字节,如果传递给ucStackDepth的值是100,则栈实际容量为400字节。
- 注意,要保证栈容量字节数不能超过uint16_t类型的的最大值65535。Idle任务的栈空间大小通过在FreeRTOSConfig.h中的configMINIMAL_STACK_SIZE宏配置。简单的给一个他们直觉上的容量。
- pvParameters:用于传递给任务函数的传参, 如果任务函数不需要传参,设置为NULL即可
- 下图中的外设任务函数原型是void TaskFunction(void* pvParameters),函数的主体流程必须是一个无限循环,不能像普通的函数一样执行完就退出,它应该永不退出,直到任务被显式地删除
程序编写-LED闪烁:
vTaskDelete(StartTask_Handler);
//一定要删除开始任务,
//如果没有删除开始任务,那么显示的现象就是灯亮了,但是灯不会闪烁
//原因是:因为要跳出创建任务的这循环,因为已经在上面两段建了,故不加就会重复创建任务,一直建一直亮着,相当没有延时地一直亮
②NVIC-Test:
编译问题:如果出现如下:
..\OBJ\LED.axf: Error: L6218E: Undefined symbol TIM_ClearITPendingBit (referred from timer.o).
不是在配置文件没有注释,就是在FWLIB中没有加入所需要的stm.....c和.h文件:
同时也需要注意波特率;
现象方面:不明白为什么输出的是开启和关闭中断,可是有定时器开启的提示:因为在tim.c中有定时器串口输出的回调函数;
而为什么在开启中断了之后TIM3还能运行,因为在手册中有提高于优先级5的定时器就会被停止,而TIM3低于优先级5被设置成了优先级4的就能屏蔽掉中断,故就有TIM3一直能运行的情况;
同时如果下面两句没了,就会一开始就进入中断,原因是如果没有这个延时1s一共让num加加到5s的函数的话,根据程序运算的速度就会马上加到5,所以才会一开始就到了能打印出关闭中断的位置:
③Task-create/delete/restore/data-check:
- 函数返回值: 成功创建任务时,返回任务句柄 TaskHandle_t。 若任务创建失败,返回 NULL。所以才有要等于任务句柄的那个等于号,表示已经创建成功了;句柄是由系统指定的唯一代号,就像身份证一样。vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
- 为什么时间片调度实验那里,直接加几次就换到另外一个任务加几次然后再切换回来几次,也就是这两个时间片是怎么安排的: