arm 学习选Cortex-M3还是arm9?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm 学习选Cortex-M3还是arm9?相关的知识,希望对你有一定的参考价值。
电子信息类在校生.大三今年.
现在玩51单片机(算上基本入门).
想学arm,不知道先选择那个入门好.Cortex-M3还是arm9?
arm9担心太难了..
学Cortex-M3后对学arm9有帮助吗?
做系统用,ARM9,三星跟ATMEL在国内比较常见。
STM32绝对的比任务ARM9易学,虽然出的晚,但是不管英文中文资料都很齐全。而且ST把所有的功能做成库,只要你会用C语言调用函数,就会用STM32。夸张了点,呵呵。。。。
参考资料:http://hi.baidu.com/ucore
参考技术A 不要听上面的人乱说ARM9比CORTEX-M3结构要复杂, 为什么? 因为CORTEX-M3是改造的ARM7, 目的是为了照顾传统嵌入式系统工程师, 因为他们学了一辈子ARM7, 并不想去再接触新的ARM架构, 因此ARM公司研发出CORTEX-M3的体系, 而有一块CORTEX-R5是对应ARM9的, 再有一块CORTEX-A8是对应ARM11, 不过后面两块在中国市场你见不到;
但说实在, ARM9的书籍确实比CORTEX-M3多很多, 这是由于他普及并且出厂时间长的原因;
ARM9和CORTEX-M3具体说哪个好说不准, M3在许多中小性企业得到非常大的拥护, 一来他结构简单容易操作, 而来他成本低适合许多小型产品, 而ARM9则在许多国外嵌入式产品得到强大的拥护, 象手机, 路由器, 车载产品等, 关键是看你想从事哪方面;
两者先学习哪个都会对另一个有帮助;
如果学ARM9的话推荐你一块开发板,MINI2440, 是一快性价比十分高的开发板, 配上韦东山的教材, 这是一个初学者非常好的选择;
顺便提一提, 不是卖广告, 如果想要MINI2440的话, 我可以帮你忙打个折:P
祝早日成为嵌入式领域的人才 参考技术B 我觉得应该重点学习一下arm9,其实最基本原理不会相差太大,arm9自然会难一点,但尽管放手去学好了,指定没坏处!祝你好运! 参考技术C Cortex-M的资料比arm9的资料少,arm9应该更易入门
在Hardfault期间,ARM Cortex-M0堆栈寄存器是以$ psp还是$ msp保存?
我有一个问题,我的Cortex-M0是硬故障,所以我试图调试它。我正在尝试打印发生硬故障时被推入堆栈的ARM内核寄存器的内容。
这是我的基本汇编代码:
__attribute__((naked)) void HardFaultVector(void) {
asm volatile(
// check LR to see whether the process stack or the main stack was being used at time of exception.
"mov r2, lr
"
"mov r3, #0x4
"
"tst r2, r3
"
"beq _MSP
"
//process stack was being used.
"_PSP:
"
"mrs r0, psp
"
"b _END
"
//main stack was being used.
"_MSP:
"
"mrs r0, msp
"
"b _END
"
"_END:
"
"b fault_handler
"
);
}
函数fault_handler
将打印被推送到进程堆栈或主堆栈的堆栈帧的内容。这是我的问题:
当我打印应该具有已保存寄存器的堆栈帧的内容时,这是我看到的:
Stack frame at 0x20000120:
pc = 0xfffffffd; saved pc 0x55555554
called by frame at 0x20000120, caller of frame at 0x20000100
Arglist at unknown address.
Locals at unknown address, Previous frame's sp is 0x20000120
Saved registers:
r0 at 0x20000100, r1 at 0x20000104, r2 at 0x20000108, r3 at 0x2000010c, r12 at 0x20000110, lr at 0x20000114, pc at 0x20000118, xPSR at 0x2000011c
您可以看到保存的寄存器,这些寄存器是发生硬故障时ARM内核推送的寄存器。您还可以看到行pc = 0xfffffffd;
,表示这是LR
的EXC_RETURN
值。值0xfffffffd
向我表明在硬故障时正在使用进程堆栈。
如果我打印$psp
值,我得到以下内容:
gdb $ p/x $psp
$91 = 0x20000328
如果我打印$msp
值,我得到以下内容:
gdb $ p/x $msp
$92 = 0x20000100
您可以清楚地看到$msp
指向堆栈的顶部,据说保存的寄存器位于堆栈顶部。这是不是意味着主堆栈具有ARM内核推送到堆栈的已保存寄存器?
如果我打印内存内容,从$msp
地址开始,我得到以下内容:
gdb $ x/8xw 0x20000100
0x20000100 <__process_stack_base__>: 0x55555555 0x55555555 0x55555555 0x55555555
0x20000110 <__process_stack_base__+16>: 0x55555555 0x55555555 0x55555555 0x55555555
它是空的...
现在,如果我打印内存内容,从$psp
地址开始,我得到以下内容:
gdb $ x/8xw 0x20000328
0x20000328 <__process_stack_base__+552>: 0x20000860 0x00000054 0x00000054 0x20000408
0x20000338 <__process_stack_base__+568>: 0x20000828 0x08001615 0x1ad10800 0x20000000
这看起来更准确。但我认为保存的寄存器应该指示它们位于闪存中的哪个位置?那么这有什么意义呢?
old_timer在你的问题下的评论都是正确的。在异常进入时,寄存器将被推送到活动堆栈,无论当时是PSP还是MSP。默认情况下,所有代码都使用主堆栈(MSP),但如果您使用的是除完全裸机之外的任何内容,则可能是您使用的任何内核都已将Thread模式切换为使用进程堆栈(PSP)。
大多数调查表明PSP正在使用中,你的记忆在PSP周围窥探,而MSP几乎无可争辩。你所拥有的唯一证据就是MSP是fault_handler
函数的结果,你没有发布源代码;所以我的第一个猜测就是这个功能在某种程度上被打破了。
还要记住,进入HardFault处理程序的一个常见原因是另一个异常处理程序导致异常。在内存损坏的情况下很容易发生这种情况。在这些情况下(假设线程模式使用PSP),CPU将首先进入处理程序模式以响应原始异常,将r0-r3,r12,lr,pc,psr
推送到进程堆栈。它将开始执行原始异常处理程序,然后再次出错,在进入HardFault处理程序时将r0-r3,r12,lr,pc,psr
推送到主堆栈。通常会有一些解决方法。
old_timer也提到使用真正的汇编语言,我也同意这里。即使((naked))
属性应该删除序言和结尾(在它们之间的大多数可能的'compilerisms'),如果它是用裸汇编语言编写的,那么你的代码将更具可读性。内联汇编语言有其用途,例如,如果你想做一些非常低级的事情,你不能从C做,但你想避免调用返回开销。但是当你的整个函数是用汇编语言编写的时候,没有理由使用它。
以上是关于arm 学习选Cortex-M3还是arm9?的主要内容,如果未能解决你的问题,请参考以下文章
初学者想学ARM嵌入式,应该选ARM9还是ARM11开发板?
ARM基础教程 | ARM Cortex-M 能跑 Linux 吗?