Tag: 嵌入式

嵌入式软件的调用树

有没有人知道一些工具来为C应用程序创建一个将在微控制器(Cortex-M3)上运行的调用树? 它可以从源代码(非理想),目标代码(首选解决方案)或运行时(可接受)生成。 我看过gprof,但是仍然有很多东西需要它才能在嵌入式系统上运行。 另外一个好处是该工具还可以提供最大堆栈深度。 更新:解决方案最好是免费的。

ANSI C中的超便携,小型复杂配置文件库?

我在ANSI C中寻找一个非常便携,简约/小的XML /配置语言库,没有外部依赖(或很少),编译低于100K。 我需要它用于中等复杂的配置文件,它必须支持Unicode。 更多要求: 可以使用/ embed /静态链接到专有代码 。 在信用到期时,将始终给予信用。 不一定是XML。 真的, 干净的代码 /没有奇怪或不一致的字符串处理。 UTF-8 。 谢谢费拉斯。

#define vs. enums用于寻址外设

我必须在基于ARM9的微控制器中编程外设寄存器。 例如,对于USART,我将相关的内存地址存储在enum : enum USART { US_BASE = (int) 0xFFFC4000, US_BRGR = US_BASE + 0x16, //… }; 然后,我在函数中使用指针来初始化寄存器: void init_usart (void) { vuint* pBRGR = (vuint*) US_BRGR; *pBRGR = 0x030C; //… } 但我的老师说我最好使用#define ,例如: #define US_BASE (0xFFFC4000) #define US_BRGR (US_BASE + 0x16) #define pBRGR ((vuint*) US_BRGR) void init_usart (void) { *pBRGR = 0x030C; } 他说,就像这样,你没有在堆栈中分配指针的开销。 […]

为什么嵌入式系统上的寄存器需要读 – 修改 – 写?

我正在阅读http://embeddedgurus.com/embedded-bridge/2010/03/different-bit-types-in-different-registers/ ,其中说: 通过读/写位,固件可在需要时设置和清除位。 它通常首先读取寄存器,修改所需的位,然后将修改后的值写回 我已经遇到了这个问题,同时保留了一些由老盐嵌入式家伙编码的生产代码。 我不明白为什么这是必要的。 当我想设置/清除一点时,我总是只是或者使用位掩码。 在我看来,这解决了任何线程安全问题,因为我假设设置(通过赋值或使用掩码进行设置)寄存器只需要一个周期。 另一方面,如果您首先读取寄存器,然后修改,然后写入,读取和写入之间发生的中断可能导致向寄存器写入旧值。 那么为什么读 – 修改 – 写? 还有必要吗?

当嵌入式编译器没有运算符new或STL支持时,如何进行C ++?

我正在为我的大学开展一个小组高级项目,并且在尝试让我的代码工作时遇到了一个主要障碍。 我们的8位Atmel微控制器的编译器不支持new或delete运算符,它不支持C ++ STL。 我可以用C编程,但是我必须实现一个我从未做过的A *算法。 虽然我最初尝试过C,但我很快意识到我之前从未做过纯C。 尝试使用结构和函数对对象进行建模正在减慢我的速度,因为我已经习惯了更清晰的C ++语法。 无论如何,我的编译器缺点的确切措辞可以在这里找到: http : //www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus 为了克服它们并仍然使用C ++,我考虑了以下可能性。 1)不要分配任何东西,只需使用模板在堆栈上生成固定数组。 2)在为对象分配空间后,分配并找到一些hack来调用对象的构造函数。 由于new不是运营商,因此不能选择新的展示位置。 3)只需使用C并将其吸收,它是一个微控制器为什么我喜欢它? 4)找到一个更好的编译器,可能会花费$$$。 第二个选项是最难的,但就我如何编写此代码而言,它将获得最大的回报。 但是,我想如果我弄错了调试它可能是一个巨大的痛苦。 我正在考虑在堆栈上创建对象,将它们的位复制到分配的空间中,然后将对象中的位清零,这样它就不会调用它的析构函数。 为此,我将使用unsigned char指针和sizeof运算符直接访问这些位以获取字节数。 这听起来很糟糕,我不知道它是否可以正常工作,但我正在考虑它。 我知道vtable可能有问题,但我不打算使用任何vtable,因为它只是一个8位微控制器。

内存泄漏调试

如果没有跟踪工具,有哪些检测/调试内存泄漏的技术?

挥发性及其有害影响

我是嵌入式开发人员,在使用I / O端口时使用volatile关键字。 但是我的项目经理建议使用volatile关键字是有害的并且有很多缺点,但我发现大多数情况下volatile在嵌入式编程中很有用,据我所知,volatile在内核代码中是有害的,因为我们代码的更改将变为不可预知的。 嵌入式系统中使用volatile还有什么缺点吗?

如何在arm平台上调试随机数据中止问题

随着基于ARM的项目的开发,我们随机获取数据,也就是当我们使用它时,我们得到数据中止中断。 但是当我们使用r14或r13检查寄存器映射时,数据中止并不总是在同一点,即使检查函数回调。 无论如何,我可以准确地获取有关数据中止的根本原因的信息吗? 我已经尝试了ref 2,但是当我捕获有关中断的数据时却无法得到相同的结果。 相关ARM数据中止错误exception调试 ARM:如何分析 数据中止exception

有没有人对C的设计和错误跟踪/控制系统有很好的指导?

我是C开发的软件工程方面的新手; 有没有人有一个很好的指导如何为C项目(特别是嵌入式)设计错误跟踪或错误控制系统? 谈论C库的错误跟踪也会有所帮助。

是否有一种编程方式来检查堆栈损坏

我正在使用multithreading嵌入式应用程序。 每个线程都根据其function分配堆栈大小。 最近我们发现其中一个线程通过定义一个超过堆栈大小的局部变量数组来破坏堆栈。 操作系统是uItron。 我的解决方案,我注册了10 mS的计时器,这个计时器将检查堆栈损坏。 堆栈损坏检查方法,1。用一些独特的模式初始化堆栈内存(我使用0x5A5A5A5A)2。检查堆栈内存顶部是否仍然是0x5A5A5A5A 我的问题, 有没有更好的方法来检查这种类型的腐败 忘了添加,立即添加:操作系统:Itron,处理器:ARM9。 编译器:不是GCC(特定于ARM9由处理器供应商提供)……并且没有内置支持堆栈检查…