tzz1983 发表于 2025-9-15 11:16:47

cyxy 发表于 2025-9-14 16:55
动态内存分配存在内存碎片化、内存分配失败的非确定性,但heap_1不会内存碎片化,总是确定的。建议再增加一 ...

这个是灵活应用,不需要重新移植,
以下三步,自已动手轻松搞定
1. 在 FreeRTOSConfig.h, 中关闭 “启用运行时间统计功能”。
2. 删除例程应用中的Task2内的调用统计相关的代码。
3. 把 heap_4 替换为heap_1 即可。

注意: heap_1不可以释放内存,用 heap_1 时不能用到会释放内存相关的调用.
   而”获取任务信息“ 需要同时用到申请内存和释放的。 所以,用 heap_1 时就不要用这个功能

另外,我记得heap_4是可以自动合并内存碎片的,难道是我记错了?

YJ.M 发表于 2025-11-3 16:33:27

你好,请问怎么子啊FreeRTOS使用中断标识Interrupt ** 建立起freeRTOS任务。
也就是freeRTOS的中断任务怎么和单片机的中断号关联并运行起来,谢谢~

tzz1983 发表于 2025-11-4 07:49:28

你好,这位朋友。你应该是一位初学者,在看到RTOS关于任务的一些特性时,对概念有些混淆了。我的表达能力也有限,我尝试解释一下,看看能不能帮你理清楚它们之间的关系。
中断:从最底层来说,中断是一种硬件机制,中断的触发源是硬件。
举例:你在正常运行一段代码,此时硬件定时器中断时间到了,触发了中断。接下来会发生的事情是,硬件机制会自动保存当前正在运行的代码的上下文(比如程序计数器、寄存器值等,在51核上体现为硬件自动入栈了返回地址),然后跳转到中断入口,运行中断服务代码。中断代码运行结束后,再恢复之前保存的上下文,返回到原来的地方继续运行。
从整个过程来理解,中断行为正如其名,就是中断当前在做的事情,优先去处理一个更紧急的硬件事件。
任务:任务是一个软件概念,也可以理解为一种代码组织结构。
举例来说:现在CPU有两个独立的事情要处理,比如同时驱动显示屏显示动画和驱动喇叭发出声音。但是CPU核只有一个,作为程序员的你,就得想办法,这怎么办呢?
于是你想到了一个办法,让CPU先花一小段时间(比如10ms)驱动显示屏,再花一小段时间驱动喇叭,在这两件事情之间来回切换。因为CPU运行速度足够快,切换频率很高,这样就两个事情都兼顾了。
并行(并发)的概念:
以刚才的任务驱动为例,程序员为每个任务分配了一个小片段的运行时间,这个叫时间片。把时间片做得足够短(比如毫秒级),由于人的反应能力有限,就感觉不到任务在两个时间片之间的切换。从外部看起来,就好像两个任务在同时运行一样,这就是任务“并行”运行的原理。严谨地说,在单核CPU上这并非真正的并行,而是并发或伪并行。
任务优先级:
任务是软件概念,在实际运用中,任务可以分配不同的优先级。即如果任务A的优先级 > 任务B的优先级,那么当任务A就绪时,它可以打断任务B的执行。
从外部看,它的结果和中断很像,但它是软件行为,是操作系统用软件模拟中断的抢占行为。所以,高优先级任务可以看作一种“软件中断”。
对比中断和任务:
从外部看,任务和中断有一个共同的属性:抢占属性。具体体现是,它们都能打断当前正在执行的低优先级代码。这种抢占机制,正是实现“并发”的核心方式。
举个例子:我们先抛开任务,现在只有中断。在中断里定时让一个LED闪烁(对端口取反),然后主循环代码里延时让另一个LED闪烁。当程序运行起来以后,看到的结果是两个LED好像在同时闪烁。这就对了,抢占给人的感觉就是“并行运行”。
从它们都具有抢占性这个共同属性来看,在特定的软件设计下,中断服务程序(ISR)里的一部分工作,可以和某个高优先级任务互换角色。比如程序员经常干的事:“把一段比较耗时的、非紧急的代码从中断中移出去,放到一个优先级较高的任务中去做”。
但是:请注意,这个“但是”才是重点。本质上,中断属于硬件机制层,而任务属于软件调度层。它们的根本区别在于:
[*]创建方式不一样:中断通常需要用特定的关键字(如 interrupt)告诉编译器,这是一个中断服务函数,或者需要在启动代码/链接脚本中配置中断向量表。而创建任务则是通过调用RTOS提供的API函数(如 xTaskCreate)在运行时动态创建的。
[*]权限不对等:一定要记住:“中断是硬件机制”。具体表现为,在绝大多数RTOS中,中断可以打断任务,但任务绝对无法打断中断。中断的响应是最高优先级的硬件行为。(注意:有些系统支持中断嵌套,即高优先级中断可以打断低优先级中断的执行,但这依然是硬件机制。)
[*]占用的资源和管理方式不一样:这涉及到系统底层规划。例如:

[*]中断通常使用一个专用的中断栈,而每个任务都有自己独立的任务栈。
[*]中断的响应延迟由硬件决定,非常短且固定;任务调度的延迟则由RTOS内核决定,受其他任务影响。
[*]中断服务程序(ISR)中能调用的函数受限(通常不能调用可能导致阻塞的函数),而任务中则自由得多。
正因为这些区别,才有了那个经典的做法:“把冗余或耗时的代码从中断中移出,放到高优先级任务中执行”,以保证系统的实时性和稳定性。


希望这些解释对你有帮助!当你实际使用RTOS做一两个小项目后,对这些概念的理解会更加深刻。

YJ.M 发表于 2025-11-4 16:16:56

tzz1983 发表于 2024-9-7 16:20
2024/9/7
FreeRTOS 在 Ai8051U 上运行的 最简代码例程
为了方便大家在Ai8051U 实验箱 上做 FreeRTOS 实验 ...

发现两个问题,导致ai8051u 运行FreeRTOS使用严重受限,

1. 8051U的edata只有2KB,在动态创建任务是,多个任务堆栈大小加一列超过768,后面的任务就会创建失败,这导致任务数量受限严重,如果创建任务堆栈大小都是128,那么只能创建4个。

2.在FreeRTOSConfig.h中没有定义“#define configSUPPORT_STATIC_ALLOCATION 1”,这就说明我们不能静态创建任务,原本还想使用静态创建任务,堆栈定义到Xdata中解决edata小的问题。但是现在不能静态创建任务了。
3.如果自己手动reeRTOSConfig.h中定义“#define configSUPPORT_STATIC_ALLOCATION 1”,编译会报错,哎。

也就是说想使用Ai8051U 玩FreeRTOS,貌似不行。

不知道哪位大神能让任务创建时堆栈定义到xdata中,膜拜等待中~~~

YJ.M 发表于 2025-11-4 16:17:43

tzz1983 发表于 2025-11-4 07:49
你好,这位朋友。你应该是一位初学者,在看到RTOS关于任务的一些特性时,对概念有些混淆了。我的表达能力也 ...

谢谢回复~学习中

PDJ 发表于 2025-11-11 19:36:42

这个参数错了

tzz1983 发表于 2025-11-12 16:20:46

PDJ 发表于 2025-11-11 19:36
这个参数错了

好的,感谢提醒

小233宋 发表于 2026-1-26 23:29:44

杨为民 发表于 2024-4-18 20:41
(1)收到,谢谢!

(2)以后在编写STCx51单片机程序的时候,对于bit位变量,千万别再写“P21=!P21”这 ...

都用上FreeRTOS了还在意这点性能,乐
页: 1 2 3 4 5 6 7 8 [9]
查看完整版本: FreeRTOS @32G12K128移植; FreeRTOS @AI8051U移植来了|重复造车轮