标签: freertos

嵌入式系统的小型libc

我正在寻找一个用于嵌入式使用ARM7微控制器上的freertos的小型libc.我看过newlib,但它对我的需求来说太复杂了.Newlib在许多函数中调用malloc()(例如printf()),这对小型嵌入式实时系统不利.

有谁知道一个适合我的应用程序的小型,可移植,开源的libc实现?

c embedded libc freertos

25
推荐指数
3
解决办法
1万
查看次数

在多任务环境中为看门狗提供服务的策略

将一些嵌入式代码移到FreeRTOS之后,我对这个看门狗留下了一个有趣的困境.看门狗定时器是我们应用的必备条件.使用FreeRTOS对我们来说也是一个巨大的福音.当应用程序更加单一任务时,它会在其逻辑流程中及时为监督者提供信息,这样我们就可以确保任务及时地取得逻辑进展.

虽然有多项任务,但这并不容易.由于某种原因,一项任务可能会受到限制,而不是取得进展,但另一项任务正在做得很好并取得足够的进展以保持看门狗愉快地享受.

一种想法是单独启动一个单独的任务来提供看门狗,然后使用一些计数器,其他任务定期增加,当看门狗任务打勾时,它将确保所有计数器看起来像是在所有其他计数器上进行任务,如果是这样,请继续为看门狗提供食物.

我很好奇其他人在这样的情况下做了什么?

embedded freertos

18
推荐指数
1
解决办法
5202
查看次数

C线程中的自增量是否安全?

我在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)

c freertos

15
推荐指数
3
解决办法
1671
查看次数

使用FOpen*的SQLite VFS实施指南

我将使用FOpen,FRead,FWrite,FSeek和FClose为Netburner嵌入式设备(非Windows)实现自定义VFS(虚拟文件系统).我很惊讶我找不到可用的VFS的FOpen*版本.这将使嵌入式设备的便携性更高.

我在http://sqlite.org/c3ref/vfs.html上找到了有关为SQLite创建VFS的一些信息, 但信息非常详细,我还有很多关于实现的问题.

我在Winite,OS2,Linux的SQLite源代码中有一些示例VFS,但它们没有很多注释,只有源代码.

我可以使用上面链接中提供的信息和示例来创建我的自定义VFS,但我确信如果我这样做,我会错过一些东西.

我的问题是:

  • 是否还有关于我缺少的SQLite VFS的文档?也许是一个实施指南?
  • 是否有可用的SQLite VFS的Fopen版本?
  • 一旦我创建了自定义SQLite VFS,是否有单元测试代码可用于测试我的自定义SQLite VFS?
  • 您希望分享的实施SQLite VFS的建议,意见和经验.

sqlite fopen vfs freertos netburner

14
推荐指数
1
解决办法
4090
查看次数

gnu arm cortex m4上的C++异常处理程序,带有freertos

更新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)

c++ embedded arm freertos cortex-m

12
推荐指数
3
解决办法
1653
查看次数

是否有可用的FreeRTOS解释语言库?

我在一家使用FreeRTOS为多个设备创建固件的公司工作.最近,我们对新功能的要求超过了我们的固件工程师能够完成的工作量,但我们现在也无法雇用任何新功能.即使是微小的变化也需要固件人员进入并修改非常低的水平.

我一直在为FreeRTOS寻找某种解释性语言项目,让我们在更高层次上实现新功能.理想情况下,我想最终得到的东西让设备变得更接近通用计算机,我们编写驱动程序,而不是我们自己必须实现每个功能.

有没有解释java,python或类似字节码的FreeRTOS项目?

我看过google,但由于我自己不是固件工程师,所以我不确定我是否在寻找合适的关键字.

感谢大家

embedded interpreter bytecode firmware freertos

11
推荐指数
1
解决办法
4526
查看次数

有关 CMake 错误的问题:没有为目标提供源

我正在尝试使用 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)

c++ debian eclipse-cdt cmake freertos

11
推荐指数
2
解决办法
6万
查看次数

防止GCC LTO删除功能

我使用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)

c gcc ld freertos lto

10
推荐指数
2
解决办法
1495
查看次数

GCC别名在翻译单元-AKA-之外运行,这甚至是适合这项工作的工具吗?

我正在使用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 我的链接器脚本执行此操作.

  • 编译器版本:gcc版本4.5.2(Sourcery G ++ Lite 2011.03-42)
  • 目标:arm-none-eabi

c gcc cortex-m3 codesourcery freertos

9
推荐指数
1
解决办法
4868
查看次数

FreeRTOS 任务不应返回 - ESP32

我在 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)

c++ multithreading freertos esp32

9
推荐指数
1
解决办法
3333
查看次数