Board logo

标题: STM32之FreeRTOS(4) [打印本页]

作者: yuyang911220    时间: 2014-10-29 09:44     标题: 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),必须创建了信号量后才可以!往往初始化中会出现如下问题




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0