当你构建一个gcc工具链时,有可能将它构建为arm-elf或arm-none-eabi,但有什么区别?
我今天使用的是eabi,但这只是因为其他人似乎都这样做了......但是因为这是一个非常糟糕的论点,所以理解它们的区别真的很好.
注意:此工具链将交叉编译基于Cortex-M3的mcu代码:如stm32.
谢谢
一些链接:
EABI:
ELF:
有人介绍如何使用binutils和newlib构建llvm + clang工具链以及如何使用它?
我正在为ARM Cortex M3(NXP LPC1769)微控制器开发软件.目前我正在寻找机制以检测我的功能是否在ISR中被调用.我认为我必须检查一个寄存器.基于这些信息,我想称之为困难的功能.
如果有一个包含必要信息的寄存器,我已经检查了参考手册.
例如,我试图根据"中断有效位寄存器"(IABR)寄存器检测我是否从ISR(我使用SysTick-ISR)调用.如果ISR处于活动状态,该寄存器应为!= 0.但值为0x00000000.这意味着没有中断处于活动状态.除了这个测试,我在参考手册中检查了NVIC和SC寄存器,搜索包含必要标志的寄存器,但我没有找到.
有没有人知道我的问题适合的注册/机制?
我正在开发一个基于Cortex-M3的自定义设备,我需要实现应用程序内编程(IAP)机制,这样就可以在没有JTAG的情况下更新设备固件(我们将使用TFTP或HTTP).虽然ST Microelectronics提供的与IAP相关的代码示例对我来说足够清楚,但我并不真正了解重新闪存的工作原理.
据我所知,CPU通过ICode总线(当然还有预取块)从Flash获取指令.所以,这是我非常愚蠢的问题:为什么运行程序在重新闪烁时会被破坏(即更改运行它的闪存)?
我正在为ARM Cortex-M3(NXP的LCP17xx)创建代码.到目前为止我一直在使用静态内存,一切运行良好.我试图添加动态内存支持,但是一旦我调用malloc,系统就会卡住.
我正在用gcc编译arm裸机,并使用newlib.版本:gcc-arm-none-eabi-4_6-2012q1
为了添加malloc支持,我实现了一个简单的_sbrk函数并修改了我的链接器脚本以为堆创建一些空间(我已经阅读了很多关于这个部分的不同教程,但没有一个涵盖我接下来遇到的问题).
在一些LED的帮助下,我可以确定代码运行到它调用的那一点malloc
,然后它就不会继续.它甚至没有达到我的_sbrk
功能.此外,sizeof
如果我malloc
稍后在代码中包含一个调用,它将陷入调用状态.
那么,当调用malloc
代码时,如果没有达到_sbrk
或返回代码,我会做错什么呢?
在对malloc
包含调用时生成的内存映射进行了很长一段时间后,当它不是时,我怀疑它与使用的结构有关malloc
.
这是定义ram内存的ld脚本的一部分:
.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
_ebss = .;
. = ALIGN (8);
_end = .;
} >sram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE( __cs3_heap_start = _start_heap)
_end_stack = 0x10008000;
Run Code Online (Sandbox Code Playgroud)
然后在中断向量表中设置_end_stack.
现在比较不同的地图.不在代码中使用malloc:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 …
Run Code Online (Sandbox Code Playgroud) 由于许可证问题,我有一个应用程序,我从Keil IDE移植到使用GNU工具链构建.我已经成功地能够在设备上设置,构建,刷新和运行应用程序.
GNU端的应用程序由于某种原因被卡在WWDG的弱链接IRQ处理程序中,这是一个无限循环.应用程序未启用WWDG,默认情况下在重置时禁用.我还验证了配置寄存器的默认启动值.
除编译器之外,唯一的区别是链接器和启动文件.但是,两个工具链使用的启动文件和链接器文件都是STM生成的默认值.
知道可能导致这种情况的原因吗?我在这里结束了我的智慧.
使用stm32f103XX,让我知道是否有任何其他信息会有所帮助.
编辑:使用下面的评论,我能够确定它实际上是正在被触发的HardFault_Handler.如果可能有帮助,我已经在下面包含了回溯输出
GDB BT:
0 HardFault_Handler()
1(信号处理程序调用)
2 0x720a3de在?? ()
3 foo(0x80005534)
Backtrace已停止:前一帧与此帧相同(损坏的堆栈?)
2件事对我来说很突出,虽然我没有gdb专家.1)foo不是一个函数,它是一个const数组的字符和2)0x0720a3de不是一个有效的内存地址,闪存地址范围从0x08000000开始
cortex M3处理器启动文件允许您指定专用于堆栈和堆的RAM量.对于c ++代码库,是否有一般的经验法则或者更明确的方法来确定堆栈和堆大小的值?例如,您是否会计算唯一对象的数量和大小,或者使用已编译的代码大小?
我正在使用STM32F107芯片在C中进行一些开发,并且在某些时候,当我调用特定函数时,设备开始重置.我没有调试器,我的调试只是串口上的纯文本.
我已经使用了一些其他的微控制器,我可以访问寄存器来查看复位的原因,但我似乎无法找到该器件的等效器件.我知道Cortex-M3的硬件异常,但我不知道其中一个是否被触发,因为当我进入这些处理程序时,我似乎无法通过usart发送文本(可能是因为我的TX功能使用中断?).
所以,我决定在这个设备中询问比我更多经验的人:调试这些情况通常会做些什么?
编辑
其中一个开发人员激活了WWDG监视器,它在我从故障处理程序获取信息之前重置了硬件.由于指向错误位置的指针调用函数,这是一个硬故障.但是,我会保留这个问题,希望有人能提供更多的细节(或关于它的材料),以便从保存的寄存器中指回C代码,比如硬故障(@dwelch的想法).
我正试图在Cortex M4上分析一个C函数(从一个中断调用,但我可以在其他地方提取它并将其分析).
有多少可能计算此功能中通常使用的循环次数?功能应该在大约4000个周期内运行,所以我认为RTC不是一个选项,并且从反汇编中手动计算周期可能很痛苦 - 只有平均才有用,因为我想在具有典型闪存/内存的典型流上进行分析使用模式.
我听说过循环计数器寄存器和MRC指令,但它们似乎可用于A8/11.我还没有在cortex-Mx micros中看到过这样的说明.
我有一个Luminary LM3s8962 ARM Cortex M3开发板,虽然我已经能够使用Keil RTOS为它编程,但我更喜欢在linux和嵌入式libc之上开发.我想知道的是我如何在我的主板上实际获得Linux内核以及我的应用程序和依赖项?它有一个SD插槽,我可以创建某种文件系统映像,只需用引导程序对电路板进行编程吗?我是否必须自己编写引导程序?我完全不知道从哪里开始.我已经查看了yocto项目,但我仍然不知道如何实际处理多兆字节内核和文件系统映像文件并让我的主板运行它们.