dfsfjwfmlwsf 发表于 2022-10-23 20:12:21

使用标准库移植freertos和使用cubemx 生成的freertos 试验结果不一致的疑问?

使用标准库移植freertos和使用cubemx 生成的freertos 试验结果不一致的疑问?

试验很简单 就是2个任务每个任务里面翻转led并串口打印

下面是标准库移植freertos2个led同时亮灭并同时500ms打印信息试验结果与设想一样


下面是cubemx生成的freertos   2个led同时亮灭   但串口打印这里却是2者间隔500ms打印信息试验结果与设想却不一样   除非把2个任务优先级更改为不一样就正常了


刚学习freertos望解答 感谢@硬汉大佬


庄永 发表于 2022-10-24 00:54:20

看这个看不出太多信息,上源码

dfsfjwfmlwsf 发表于 2022-10-24 12:01:41

本帖最后由 dfsfjwfmlwsf 于 2022-10-24 14:44 编辑

庄永 发表于 2022-10-24 00:54
看这个看不出太多信息,上源码
大佬 有空帮忙看一下感谢{:33:}

baobao5 发表于 2022-10-24 14:30:12

osdely是不是阻塞了啊,两个任务一个完成另一个才动

dfsfjwfmlwsf 发表于 2022-10-24 15:43:45

baobao5 发表于 2022-10-24 14:30
osdely是不是阻塞了啊,两个任务一个完成另一个才动

osStatus osDelay (uint32_t millisec)
{
#if INCLUDE_vTaskDelay
TickType_t ticks = millisec / portTICK_PERIOD_MS;

vTaskDelay(ticks ? ticks : 1);          /* Minimum delay = 1 tick */

return osOK;
#else
(void) millisec;

return osErrorResource;
#endif
}

osDelay 我看也是调用的vTaskDelay    初学者没有想明白

tovinz 发表于 2022-10-24 16:49:17

好久没用过freertos了,你把你那个标准库的两个任务的优先级都改成0试一下是不是和cube生成的一样的效果。刚刚翻了一下手册,freertos的空闲任务优先级为0,cube使用的cmsis封装的任务优先级osPriorityNormal也是0,这样弄的话系统中所有的任务的优先级都是0,此时freertos采用时间片轮询调度算法,不知道是不是这样解释的

庄永 发表于 2022-10-24 21:44:52

dfsfjwfmlwsf 发表于 2022-10-24 12:01
大佬 有空帮忙看一下感谢

你没有看起时间片轮询功能,相同优先级下的执行不正常。FreeRTOSConfig.h下定义宏configUSE_TIME_SLICING开启这个功能

庄永 发表于 2022-10-24 22:35:29

dfsfjwfmlwsf 发表于 2022-10-24 12:01
大佬 有空帮忙看一下感谢

另外printf应该也不行,你找硬汉自己实现的printf看看。我手里没有板子,你这两个都试一下。

dfsfjwfmlwsf 发表于 2022-10-25 11:55:21

庄永 发表于 2022-10-24 22:35
另外printf应该也不行,你找硬汉自己实现的printf看看。我手里没有板子,你这两个都试一下。

感谢解答cubemx生成的工程时间片是默认开启的      应该还是printf打印的问题    我设置变量每次++仿真看   2个任务是同步增加的

庄永 发表于 2022-10-25 21:39:19

dfsfjwfmlwsf 发表于 2022-10-25 11:55
感谢解答cubemx生成的工程时间片是默认开启的      应该还是printf打印的问题    我设置变量每次++仿真 ...

我看你的代码没有使能这个宏,不知道CubeMX会不会开启。
你这个printf不可靠的,实在要这样用,加入临界段保护
页: [1]
查看完整版本: 使用标准库移植freertos和使用cubemx 生成的freertos 试验结果不一致的疑问?