arm 学习选Cortex-M3还是arm9?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm 学习选Cortex-M3还是arm9?相关的知识,希望对你有一定的参考价值。

电子信息类在校生.大三今年.
现在玩51单片机(算上基本入门).
想学arm,不知道先选择那个入门好.Cortex-M3还是arm9?
arm9担心太难了..
学Cortex-M3后对学arm9有帮助吗?

做单片机用,学CORTEX,以STM32系列为代表
做系统用,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;,表示这是LREXC_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 吗?

想学习嵌入式以后做驱动开发,直接学习ARM9,ARM11还是先学STM32?

Cortex-M可以跑Linux操作系统吗?

小熊派开发环境准备——MDK软件安装介绍

STM32Cortex-ACortex-RCortex-MSecurCore