我有一个Luminary LM3s8962 ARM Cortex M3开发板,虽然我已经能够使用Keil RTOS为它编程,但我更喜欢在linux和嵌入式libc之上开发.我想知道的是我如何在我的主板上实际获得Linux内核以及我的应用程序和依赖项?它有一个SD插槽,我可以创建某种文件系统映像,只需用引导程序对电路板进行编程吗?我是否必须自己编写引导程序?我完全不知道从哪里开始.我已经查看了yocto项目,但我仍然不知道如何实际处理多兆字节内核和文件系统映像文件并让我的主板运行它们.
我想计算在ARM cortex-M4(或cortex-M3)处理器上执行的每个循环的指令数.
它需要的是:我想要分析的代码的指令数量(在运行时执行)和代码执行的周期数.
1 - 周期数
使用循环计数器非常简单直接.
volatile unsigned int *DWT_CYCCNT ;
volatile unsigned int *DWT_CONTROL ;
volatile unsigned int *SCB_DEMCR ;
void reset_timer(){
DWT_CYCCNT = (int *)0xE0001004; //address of the register
DWT_CONTROL = (int *)0xE0001000; //address of the register
SCB_DEMCR = (int *)0xE000EDFC; //address of the register
*SCB_DEMCR = *SCB_DEMCR | 0x01000000;
*DWT_CYCCNT = 0; // reset the counter
*DWT_CONTROL = 0;
}
void start_timer(){
*DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter …Run Code Online (Sandbox Code Playgroud) 我正在尝试开始使用STM32(Cortex-M3),我的计划是从Ubuntu(9.04/AMD64)开始使用它.
首先,我得到了Olimex stm32-h103标题板和Olimex ARM-USB-OCD jtag,并且我可能会使用OpenOCD,gcc和Eclipse.
但是现在我正在研究使用什么版本的gcc以及如何设置它以便能够交叉编译代码.
似乎有一些手臂项目,但我不知道从什么开始,有人可以推动我朝着正确的方向前进吗?
谢谢约翰
更新:似乎几乎是什么,我想从CodeSourcery的,但他们似乎把重点放在IA32和AMD64没有.
但是在支持的设备中,我找到了Cortex-M3
更新:有可能在AMD64上安装IA32,因此标记的答案可能已经过时了.
更新:找到有关Cortex-M3的交叉编译的链接.
是否可以使用带--target开关的vanilla GCC编译ARM Cortex M3(LPC1768)的C/C++代码,还是需要编译GCC,binutils等来执行此操作?
我正在使用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 或我的链接器脚本执行此操作.
我想链接原始二进制数据.我想把它放在一个特定的地址,或者把它链接到我在代码中定义的符号(例如char*mydata).因为它不是一个obj文件,所以我不能简单地将它链接起来.
类似的帖子(包含GNU ld链接器脚本的二进制文件)建议使用带-B bfdarch选项的objcopy .objcopy以"archictecture bfdarch unknown"作为回应.
另一个答案建议将对象转换为自定义LD脚本,然后将其包含在主LD脚本中.在这一点上,我可能只是使用一个C包含文件(这就是我现在正在做的)所以我宁愿不这样做.
我可以使用objcopy来实现这一目标,还是有其他方法?
我正在使用飞思卡尔Kinetis K60并使用CodeWarrior IDE(我认为它使用GCC作为编译器).
我想将两个32位数相乘(这导致64位数)并且只保留高32位.
我认为ARM Cortex-M4的正确汇编指令是SMMUL指令.我更喜欢从C代码而不是汇编访问此指令.我该怎么做呢?
我想代码理想情况下是这样的:
int a,b,c;
a = 1073741824; // 0x40000000 = 0.5 as a D0 fixed point number
b = 1073741824; // 0x40000000 = 0.5 as a D0 fixed point number
c = ((long long)a*b) >> 31; // 31 because there are two sign bits after the multiplication
// so I can throw away the most significant bit
Run Code Online (Sandbox Code Playgroud)
当我在CodeWarrior中尝试这个时,我得到c的正确结果(536870912 = 0.25作为D0 FP号).我没有看到任何地方的SMMUL指令,乘法是3条指令(UMULL,MLA和MLA - 我不明白它为什么使用无符号乘法,但这是另一个问题).我也尝试过32的右移,因为这可能对SMMUL指令更有意义,但这并没有做任何不同的事情.
有没有人已经在cortexM3节点上实现了zeroMQ作为可靠的消息解决方案?我试图了解它是否可能并且有一个内存足迹的想法.我可能会有freeRTOS OS.感谢您的想法和建议.尼古拉
在ARM 文档中,它提到
Cortex-M4 处理器支持 ARMv7 未对齐访问,并将所有访问作为单个未对齐访问执行。它们通过 DCode 和系统总线接口转换为两个或多个对齐的访问。
我不清楚这是否意味着数据访问对程序员来说是原子的。然后我发现了一个 StackOverflow注释,将文档解释为:
实际上,一些 ARM 处理器(例如 Cortex-M3)支持硬件中的未对齐访问,因此即使是未对齐的读/写也是原子的。访问可能跨越多个总线周期到内存,但没有机会让另一条指令在其间跳转,因此对程序员来说是原子的。
不过,我看了看周围多一些,发现索赔违背了先前的要求:
另一个事实是,在 ARMv6 及更高版本的内核上,为了让硬件“修复”未对齐的访问,它会将其拆分为多个较小的字节负载。但是,这些不是原子的!。
那么,我相信谁呢?对于某些情况,我的项目中的打包结构中的每个元素都有 setter/getter 。换句话说,某些结构元素可能未对齐。我想知道在 Cortex-M4 上访问结构元素是否总是保证是原子的。如果不是,我想我将不得不手动启用/禁用中断或添加一些互斥锁,但如果 ARM Cortex M4 可以保证数据访问是原子的,我宁愿不这样做。
在 ARM Cortex M3(类似于 STM32F101)上的实时应用程序¹中,我需要在尽可能紧密的循环中轮询一些内部外设寄存器直到它为零。我使用位带来访问适当的位。(工作)C 代码是
while (*(volatile uint32_t*)kMyBit != 0);
Run Code Online (Sandbox Code Playgroud)
该代码被复制到片上可执行 RAM 中。经过一些手动优化²,轮询循环下降到以下,我将³计时为 6 个周期:
0x00600200 681A LDR r2,[r3,#0x00]
0x00600202 2A00 CMP r2,#0x00
0x00600204 D1FC BNE 0x00600200
Run Code Online (Sandbox Code Playgroud)
如何降低投票的不确定性?5 个周期的循环符合我的目标:在它变为零后尽可能接近 15.5 个周期对同一位进行采样。
我的规范要求可靠地检测至少 6.5 个 CPU 时钟周期的低脉冲;如果持续时间少于 12.5 个周期,则可靠地将其归类为短;如果它持续超过 18.5 个周期,就可以可靠地对其进行分类。脉冲与 CPU 时钟没有确定的相位关系,这是我唯一准确的时序参考。这需要最多 5 个时钟的轮询循环。实际上,我正在模拟在几十年前的 8 位 CPU 上运行的代码,该 CPU 可以以 5 个时钟周期进行轮询,而这已成为规范。
我试图通过在循环之前插入 NOP 来抵消代码对齐,在我尝试过的许多变体中,但从未观察到任何变化。
我试图反转 CMP 和 LDR,但仍然得到 6 个周期:
0x00600200 681A LDR r2,[r3,#0x00]
; we loop here
0x00600202 2A00 CMP r2,#0x00
0x00600204 681A LDR r2,[r3,#0x00]
0x00600206 …Run Code Online (Sandbox Code Playgroud)