问题标签 [freertos]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
83 浏览

operating-system - 独立于操作系统的应用程序代码

我正在编写基于 C 的嵌入式应用程序代码,我想让它在任何用“C”编写的操作系统中运行,例如免费的 RTOS 或 Contiki 或 unix 等。

因此,如果我想在任何操作系统上轻松移植,我认为下面是我需要创建抽象的模块。

我仍然认为还有其他模块需要抽象为其他操作系统轻松移植..有人可以建议任何其他模块吗?

0 投票
1 回答
284 浏览

c - 写入闪存页面期间电源故障序列死锁

我目前正在使用带有 FreeRTOS 作为系统操作系统的 ARM Cortex M3 微控制器进行嵌入式项目。该代码是由一位前同事编写的,遗憾的是该项目有一些奇怪的错误,我必须尽快找到并修复它们。

简短描述:该设备集成到车辆中,并使用集成调制解调器将一些“特殊”数据发送到远程服务器。

主要问题:由于设备集成在车辆中,设备的电源随时可能丢失。因此,设备将“特殊”数据的某些部分存储到两个保留的闪存页中。该代码模块被布置为两个闪存页面上的 eeprom 仿真(用于磨损均衡和从一个闪存页面到另一个闪存页面的数据传输)。eeprom 仿真使用所谓的“虚拟地址”,您可以在其中将任何大小的数据块写入当前活动/有效的闪存页面,并使用这些虚拟地址将其读回。前同事将 eeprom 仿真实现为多任务模块,您可以在其中从应用程序中的每个任务读取/写入闪存页面。乍一看,一切似乎都很好。

但我的项目经理告诉我,设备总是会丢失一些“特殊”数据,此时车辆中的电源电压会下降到一些伏特,设备会尝试将数据保存到闪存中。通常电源电压约为 10-18 伏,但如果降至 7 伏以下,设备会收到一个称为中断的中断powerwarn并触发一个称为 的任务powerfail task。具有所有任务的powerfail task最高优先级并执行一些回调,例如关闭调制解调器以及“特殊”数据存储在闪存页面中的位置。我试图理解代码并调试了几天/几周,现在我很确定我发现了问题:

在 powerfail 任务执行的那些回调(称为 powerfail 回调)中,有 RTOS 调用,其他任务在这些调用中被挂起。但不幸的是EEPROM_WriteBlock(),在收到 powerwarn 中断之前,那些暂停的任务也可能有一个未完成的调用。因此,powerfail 任务执行回调,并且在其中一个回调中有一个EE_WriteBlock()调用,其中任务无法获取互斥锁,EE_WriteBlock()因为另一个任务(已暂停)已经获取了它--> 死锁!

这是将数据写入闪存的例程:

这是调用“xSemaphoreTakeRecursive()”时的 RTOS 特定代码:

我的项目经理很高兴我发现了这个错误,但他也强迫我尽快创建一个修复程序,但我真正想要的是重写代码。也许你们中的一个人可能会想,只要避免暂停其他任务就完成了,但这不是一个可能的解决方案,因为这可能会触发另一个错误。有没有人有一个快速的解决方案/想法我可以如何解决这个死锁问题?也许我可以使用xTaskGetCurrentTaskHandle()inEE_WriteBlock()来确定谁拥有互斥锁的所有权,然后在任务不再运行时给出它。

谢谢

0 投票
2 回答
621 浏览

c - 为什么 FreeRTOS 中需要程序集包装器?

在我们的 PIC32MX 上使用 FreeRTOS 之前,我们能够通过简单地使用 ISR 来处理中断,例如:

但是自从向我们介绍 FreeRTOS 后,我的讲师就让我们使用程序集包装器来处理中断。我们使用一个属性将中断向量绑定到我们要处理中断的函数,然后使用一些程序集来保存上下文,而不是这样:

为什么我们需要在 FreeRTOS 中执行此操作?

0 投票
1 回答
150 浏览

freertos - 为什么创建 IDLE 任务时 FreeRTOS windows demo 失败?

我从 FreeRTOS 开始,我正在尝试调试 Windows Demo。它编译得很好,但是当我单步执行代码时,我可以看到当 FreeRTOS 尝试创建空闲任务时,正在生成xTaskGenericCreate中的断言。

我不知道为什么会这样,因为我没有修改原始演示代码。

谁能帮我解决这个问题?

问候

0 投票
1 回答
799 浏览

c - FreeRTOS / 在哪里存储任务中声明的变量?

我是 FreeRTOS (ARM CM3) 的初学者,我的问题是:

当您创建一个内部包含一些局部变量的任务时,这些变量存储在 RAM 中、堆栈(由 main() 使用)中的位置,就像局部变量的一般情况一样,或者存储在专用于该任务的堆栈中(使用 xTaskCreate() 函数/usStackDepth 参数创建)?

此致

0 投票
1 回答
1417 浏览

c - AM335x FreeRTOS 端口,无法处理 IRQ 和 SWI

我目前正在尝试将 FreeRTOS 移植到 TI AM335x 处理器,该处理器以在 BeagleBones 上使用而闻名。我能够启动、运行 GPIO 并设置一个比较匹配计时器来运行系统滴答声。如果我禁用中断,我可以看到在定时器启动后的正确时间后如何设置中断。如果我启用中断,我的应用程序会在相同的给定时间后死掉。如果我尝试产生一个任务,也就是调用 SWI 处理程序,应用程序也会死掉。这让我相信向量表不可用或设置不正确。SWI 和 IRQ 的 ROM 异常向量的内容为 4030CE08h 和 4030CE18h。在 RAM 中再次执行一些分支,TRM 说:

用户代码可以将任何异常重定向到自定义处理程序,方法是将其地址写入从 4030CE24h 到 4030CE3Ch 的适当位置,或者覆盖从 4030CE04h 到 4030CE1Ch 地址之间的分支(加载到 PC)指令。

因此,我的 vIRQHandler 函数地址被写入 4030CE38h。人们希望这已经足够了,但遗憾的是没有。我怀疑我的 boot.s 文件中有问题,但是我的程序集从未如此出色,我正在努力理解代码。boot.s 和项目的其余部分是从 OMAP3 端口启动的。靴子:

启动的分支为每种模式设置一个堆栈并清除 bss,不确定这是否相关。这是似乎与我相关的代码,我已经更新了单词以适应 AM335 而不是 OMAP3。

设置 IRQ 处理程序:

如果有人对组装新手有任何指示,那将是非常受欢迎的,因为我完全被卡住了:)

0 投票
1 回答
83 浏览

c - FreeRTOS 跨线程读取

让一个线程修改一个原子单元(例如一个字符)而另一个只读取它是否安全?当然,在允许这样做的环境中,例如 freertos。

我得到了一些执行此操作的代码,它使用 bool(定义为 char)作为信号量,我不确定他们为什么不使用信号量只是为了清楚起见,但是我又看不到使用的危险一个字符或者真的。

0 投票
1 回答
5603 浏览

rtos - FreeRTOS 使用什么样的调度程序?

FreeRTOS 使用什么样的调度程序?

我在某处读到它是完成调度程序的运行,但另一方面,我也看到它被用于并行任务,所以它不会是循环调度程序?

0 投票
2 回答
6310 浏览

c - 为 FreeRTOS 中的线程安全重新定义 malloc

我可以做这样的事情:

并期望它总是调用pvPortMalloc()而不是malloc()?

另外,将它放在之前/之后会有什么区别#include <stdlib.h>

我有一些代码想在 FreeRTOS 内外运行,我想用使用 FreeRTOS 时的调用替换所有malloc()调用。pvPortMalloc()

0 投票
2 回答
775 浏览

task - freeRtos中队列中信号量的实现

freeRtos中的队列从一开始也是互斥的,我的意思是,我应该创建某种互斥来写入或读取队列,还是已经由函数xQueueRead和xQueueSend实现。