首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32之FreeRTOS(4)

STM32之FreeRTOS(4)

听说FreeRTOS任务可以同优先级,但是发现同优先级创建3个以上任务就无法调度?不知道是什么原因?
原因:一般情况下,刚开始学FreeRTOS都习惯将任务栈空间设置为1000,这意味着将要在系统里面申请4000个字节(栈空间以4字节为单位);创建3个任务,申请的约为12K左右的样子,如果再创建一个任务,也是用的1000; 那么意味着向系统申请16K左右的栈空间。加上空闲任务的栈空间,你FreeRTOSConfig.h文件里面的栈空间默认值为#define configTOTAL_HEAP_SIZE( ( size_t ) ( 17 * 1024 ) );也就是17K。显然运行不了,是因为堆栈空间不足的原因!
解决:两种办法:1、任务栈空间调小点,变成500;2、系统栈空间调大点,变成30K ;一般就足够你跑5到6个任务了。如果再小,跑得更多!

调度器只能调度一次就崩溃了,移植汇编都没问题?
原因:你的任务函数没放在死循环里面!




发现一个问题,在使用


vSemaphoreCreateBinary(xActiveSemaphore);创建二值信号量后,不能立即使用xSemaphoreGive(xActiveSemaphore)释放二值信号量!官网说明如下:
vSemaphoreCreateBinary  is a Macro to release a semaphore. The semaphore must have previously been created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or xSemaphoreCreateCounting(), and obtained using sSemaphoreTake().
意思是vSemaphoreCreateBinary  是一个用于释放信号量的宏。其中的信号量必须被xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or xSemaphoreCreateCounting()等函数调用完成后,而且必须被sSemaphoreTake()获取后才能使用!
简单地说是要xSemaphoreGive(xActiveSemaphore),必须创建了信号量后才可以!往往初始化中会出现如下问题
继承事业,薪火相传
返回列表