我正在寻找一个用于嵌入式使用ARM7微控制器上的freertos的小型libc.我看过newlib,但它对我的需求来说太复杂了.Newlib在许多函数中调用malloc()(例如printf()),这对小型嵌入式实时系统不利.
有谁知道一个适合我的应用程序的小型,可移植,开源的libc实现?
将一些嵌入式代码移到FreeRTOS之后,我对这个看门狗留下了一个有趣的困境.看门狗定时器是我们应用的必备条件.使用FreeRTOS对我们来说也是一个巨大的福音.当应用程序更加单一任务时,它会在其逻辑流程中及时为监督者提供信息,这样我们就可以确保任务及时地取得逻辑进展.
虽然有多项任务,但这并不容易.由于某种原因,一项任务可能会受到限制,而不是取得进展,但另一项任务正在做得很好并取得足够的进展以保持看门狗愉快地享受.
一种想法是单独启动一个单独的任务来提供看门狗,然后使用一些计数器,其他任务定期增加,当看门狗任务打勾时,它将确保所有计数器看起来像是在所有其他计数器上进行任务,如果是这样,请继续为看门狗提供食物.
我很好奇其他人在这样的情况下做了什么?
我在FreeRTOS(FreeRTOSV7.4.0\FreeRTOS\Source\tasks.c)中找到了一些代码:
void vTaskSuspendAll( void )
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
}
Run Code Online (Sandbox Code Playgroud)
它明确表示不需要保护,因为类型是"portBASE_TYPE",这是一个"长"类型.我的理解是它假设这种类型的自增量是原子的.但是在我拆开它后我找不到任何证据,它是一个普通的load-> add-> store.那是一个问题吗?
void vTaskSuspendAll( void )
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
4dc: 4b03 ldr r3, [pc, #12] ; (4ec <vTaskSuspendAll+0x10>)
4de: f8d3 2118 ldr.w r2, [r3, #280] ; 0x118
4e2: 1c50 adds r0, r2, #1
4e4: f8c3 0118 str.w r0, [r3, #280] ; 0x118 …
Run Code Online (Sandbox Code Playgroud) 我将使用FOpen,FRead,FWrite,FSeek和FClose为Netburner嵌入式设备(非Windows)实现自定义VFS(虚拟文件系统).我很惊讶我找不到可用的VFS的FOpen*版本.这将使嵌入式设备的便携性更高.
我在http://sqlite.org/c3ref/vfs.html上找到了有关为SQLite创建VFS的一些信息, 但信息非常详细,我还有很多关于实现的问题.
我在Winite,OS2,Linux的SQLite源代码中有一些示例VFS,但它们没有很多注释,只有源代码.
我可以使用上面链接中提供的信息和示例来创建我的自定义VFS,但我确信如果我这样做,我会错过一些东西.
我的问题是:
更新2016-12 此行为现在还有一个最小的示例:https://community.nxp.com/message/862676
我正在使用ARM Cortex M4和freertos使用freescales自由Kinetis IDE(gnu arm工具链).问题是
try {
throw 4; // old scenario also not working: throw std::runtime_error("wut");
} catch (...) {
}
Run Code Online (Sandbox Code Playgroud)
在try处理程序之后导致暂停的CPU和代码,或者在catch处理程序中(当添加一些代码时)不会执行.
可以在这里找到汇编:https://gist.github.com/Superlokkus/3c4201893b4c51e154e2a0afdf78fef0
我认为这会导致SVC中断,我很抱歉我弄错了,Freertos欺骗了我,因为当我扔东西时它会在DefaultISR中停止.
throw indeeds跳转到 __cxa_throw然后从那里跳到___Unwind_RaiseException __gnu_Unwind_RaiseException __cxa_begin_catch> <_ZSt9terminatev>
所以它看起来像是std::terminate
被调用,但是catch all块不应该允许这个.或者我的假设是错误的,这种行为是因为gcc C++运行时异常支持是一个总是调用终止的存根?!
更新2016-09:因为我看到rand()尝试使用malloc(),我还定义了一个工作的malloc()/ freeRTOS函数和etvoilà:__ cxa_allocate_exception使用malloc(我想知道工具链是如何期望我处理bad_alloc的情况).所以现在,它仍然崩溃,但在异常分配后(我认为):执行路径是:
(throwing function after exception allocation)
__cxa_throw
... //(some intructions in __cxa_throw)
__cxa_begin_catch //I guess something went wrong here
_ZSt9terminatev // Immediately after __cxa_begin_catch
_ZN10__cxxabiv111__terminateEPFvvE:
00016dfc: push {r3, lr}
00016dfe: blx r0 //Goes …
Run Code Online (Sandbox Code Playgroud) 我在一家使用FreeRTOS为多个设备创建固件的公司工作.最近,我们对新功能的要求超过了我们的固件工程师能够完成的工作量,但我们现在也无法雇用任何新功能.即使是微小的变化也需要固件人员进入并修改非常低的水平.
我一直在为FreeRTOS寻找某种解释性语言项目,让我们在更高层次上实现新功能.理想情况下,我想最终得到的东西让设备变得更接近通用计算机,我们编写驱动程序,而不是我们自己必须实现每个功能.
有没有解释java,python或类似字节码的FreeRTOS项目?
我看过google,但由于我自己不是固件工程师,所以我不确定我是否在寻找合适的关键字.
感谢大家
我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中,但出现错误。我运行的是 debian 10,我的 cmake 版本是 3.13.4。cmake 的文件可以在此 git repo中找到。当我运行以下命令时:
frank@debian:~/temp2/build$ cmake ../../temp2/AM335X-FreeRTOS-lwip/ -G"Eclipse CDT4 - Unix Makefiles"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
CMake Error at ProjectIncludes.cmake:46 (add_library):
No SOURCES given to target: lib_third_party_ti_platform_beaglebone
Call Stack (most recent call first):
CMakeLists.txt:33 (include)
CMake Error at ProjectIncludes.cmake:30 (add_library):
No SOURCES given to target: lib_third_party_ti_utils
Call Stack (most recent call first):
CMakeLists.txt:33 (include)
CMake Error at ProjectIncludes.cmake:38 (add_library):
No SOURCES given to target: lib_third_party_ti_mmcsdlib
Call Stack (most recent call …
Run Code Online (Sandbox Code Playgroud) 我使用GCC-ARM-Embedded和FreeRTOS.FreeRTOS具有vTaskSwitchContext()
仅在某些内联汇编程序代码中使用的函数.
问题是:当我使用LTO时,GCC不考虑内联汇编程序代码并认为该函数未被使用,因此将其删除.然后链接器失败,因为内联汇编程序代码中的函数调用无法解析.
我会申请,__attribute__((used))
但我不想触摸FreeRTOS代码(它是由STM32CubeMX生成的).
我尝试将它放在我的代码中,但实际上GCC足够智能,不允许这个工作:
if(false)
vTaskSwitchContext();
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉GCC在不同的源文件或通过参数,不应该删除此功能?
例
// file1.c
void vTaskSwitchContext( void )
{
...
}
// file2.c
void xPortPendSVHandler( void )
{
__asm volatile
(
...
" isb \n"
" bl vTaskSwitchContext \n"
" mov r0, #0 \n"
...
);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用STR32(Cortex-M3)上的FreeRTOS,并使用ST的CMSIS库来引导所有内容.
CMSIS库SVC_Handler
在启动".s"文件中定义弱符号.必须在某处重写它才能将ISR置于中断向量表中.FreeRTOS定义vPortSVCHandler
,这是我想要处理SVC中断的ISR.
我想使用我的应用程序代码(即没有修改FreeRTOS或CMSIS源代码)将两者"粘合"在一起.我认为别名是工作的正确工具,所以我尝试了这个(在一个单独的源文件main.c中):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Run Code Online (Sandbox Code Playgroud)
这导致: error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
事实证明,根据GCC文档http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html,为了使用该alias
属性,您不能在翻译单元之外别名.所以我想我会尝试extern
将符号转换为main.c,如下所示:
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Run Code Online (Sandbox Code Playgroud)
这会产生相同的错误.有什么建议???
我真的想避免修改任何一个库.我知道我可以编写一个SVC_Handler
简单调用的函数vPortSVCHandler
,但这可能会给ISR增加不必要的开销(可能取决于优化设置).注意:FreeRTOS示例通过自定义启动文件实现此目的.我正在寻找一种方法来从C 或我的链接器脚本执行此操作.
我在 ESP32 上使用多线程。我创建了两个任务并将它们固定到核心 1。使用其中一个,我收到以下错误:
E (20426) FreeRTOS: FreeRTOS Task "MeasurementTask" should not return, Aborting now!
abort() was called at PC 0x4008b8f3 on core 1
Backtrace: 0x4008f34c:0x3ffd0a40 0x4008f57d:0x3ffd0a60 0x4008b8f3:0x3ffd0a80
Rebooting...
Run Code Online (Sandbox Code Playgroud)
但是,return
我的“MeasurementTask”中没有任何声明(见下面的代码)。这里有什么问题?
tracker.cpp
:
E (20426) FreeRTOS: FreeRTOS Task "MeasurementTask" should not return, Aborting now!
abort() was called at PC 0x4008b8f3 on core 1
Backtrace: 0x4008f34c:0x3ffd0a40 0x4008f57d:0x3ffd0a60 0x4008b8f3:0x3ffd0a80
Rebooting...
Run Code Online (Sandbox Code Playgroud)
草图:
#include "tracker.h"
void threadedLoop(void *pvParameters) {
Serial.println("Loop task pinned");
for(;;) {
checkAPTrigger();
mqttLoop();
}
}
void setupTracker() {
Serial.print("Setup start: …
Run Code Online (Sandbox Code Playgroud)