开始
Cubemx初始化完后,任务只运行第一个,刚开始以为是没开启时间调度,后面查看代码,发现main函数中 osKernelStart() 封装了vTaskStartScheduler();后来发现是堆设置的不够,默认为3072B(字节),改为10*1024B(1KB=1024B)即为10KB(STM32103Fc8t6的FLASH大小为64KB,RAM为20KB(堆区占用的是RAM)),任务正常运行。(为何3072会不够用呢(只添加了两个任务),改成4000又够用了)。
因为使用串口,重定向了printf();调用C标准库,导致FLASH不够用,解决方法:在cmakelists.txt中加入代码,即可使用精简版的C标准库
add_link_options(-specs=nano.specs)
注: FreeRTOS Heap Usage报错应该是BUG,他只识别到了1024并没有识别到*10,所以报错提醒我堆已经没有剩余了
1 任务管理

2 信号量
2.1 同步与互斥的理解:
两者都是两个任务之间不能同时运行,同步是一种特殊的互斥,同步是必须按某种特定的顺序运行。
2.2 阻塞时间的理解:
阻塞时间是当任务获取信号量的时候由于信号量无效从而导致任务进入阻塞态的最大时钟节拍数。(即任务进入阻塞的最大时间,若设置阻塞时间为portMAX_DELAY,则任务一直阻塞,直到信号量有资源才会被唤醒。)
2.3 互斥信号量的理解:
(用于互斥任务之间互斥的访问一个临界资源,同一时间只能一个任务可以使用)当多个任务需要互斥进行时(多个任务均有同一OLED显示的任务),创建一个互斥信号量,一个任务去获取这个信号量(xSemaphoreTake()),在完成相应任务之后,又释放这个信号量(xSemaphoreGive()),另一个任务再获取这个信号量,执行相应任务。当信号量被占用时,其他任务获取信号量,若获得失败,