> For the complete documentation index, see [llms.txt](https://oceanaparts.gitbook.io/halnote/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://oceanaparts.gitbook.io/halnote/qian-ru-shi-de-ji-ge-gai-nian.md).

# 嵌入式的几个概念

### 什么是内核，与MCU又是什么关系

要知道现代芯片设计和生产已经高度分工，一个STM32F103芯片中的模块（很多都可以称之为外设）（也就是上图中的颜色各异的[方块](https://www.zhihu.com/search?q=%E6%96%B9%E5%9D%97\&search_source=Entity\&hybrid_search_source=Entity\&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A472869918%7D)）并不是全部都由ST这一家公司独立完成的，反而是由不同的专业团队各自设计其中的一块或几块，再由ST公司（购买后）拼接在自己设计的芯片中。

比如SPI模块是由公司A授权使用，CAN模块是由公司B授权使用，ST拿到这些模块之后再通过[标准总线](https://www.zhihu.com/search?q=%E6%A0%87%E5%87%86%E6%80%BB%E7%BA%BF\&search_source=Entity\&hybrid_search_source=Entity\&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A472869918%7D)将他们连接起来，就变成了一块MCU，虽然可能A和B就是ST的子公司或内部团队。也就是说，芯片公司在设计一款芯片的时候，在一定程度上和我们去电脑城组装一台电脑有点相似，当然复杂性更高，以及更多工作要做。

所以芯片公司在设计通用芯片时，会考虑到芯片的核心运算功能通用性比较高，也就是不同芯片其实对核心运算功能的要求很相似（不同人的[大脑结构](https://www.zhihu.com/search?q=%E5%A4%A7%E8%84%91%E7%BB%93%E6%9E%84\&search_source=Entity\&hybrid_search_source=Entity\&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A472869918%7D)相似），所以不会专门花心思去设计这一部分，反而芯片公司会去购买专门设计[内核](https://www.zhihu.com/search?q=%E5%86%85%E6%A0%B8\&search_source=Entity\&hybrid_search_source=Entity\&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A472869918%7D)的公司设计出的内核。**我们这里讨论的ARM核就是一种专门卖给芯片公司使用的内核。**

也就是说内核有点类似于电脑的CPU，负责主要的数据计算，而外设诸如flash ram gpio，spi等等类似于电脑的硬件，比如硬盘内存，键盘接口之类的

* ARM架构又分为三种主要内核A、R、M，性能依次排列。 高性能的A内核，如苹果、高通骁龙、华为麒麟&、一星猎户座只的芯片都是基于ARM的A内核设计的。 高实时性的R内核，针对高实时性设计 M内核主要针对微处理器Q/控制器。如stm32，nrf52840%等等 它们都使用精简指令集，他们也都是32/64bit的内核架构，
* 不同内核支持的具体指令可能不太相同，而且计算能力也不大相同，所以实际上是需要根据需求去进行选择的
* 而实际编程中需要接触操作的内核寄存器比较少，但并不是没有在涉及中断，包括启动的中断向量表中就有可能涉及

### MDK是如何编译

<img src="https://s2.loli.net/2023/03/13/jDErIQKzh5uvYX3.png" alt="" height="60%" width="60%">

上图是在Coretx-M3权威指南的第10章找到的，而使用的编译器armcc，汇编器armasm,链接器armlink都可以在mdk的安装目录ARM\ARMCC\bin下找到

这个armcc是一个交叉编译器，所谓的交叉编译器就是可以跨平台编译程序，比如在x86架构编译arm架构的程序。

#### ARMCC与ARMCLANG，ARM Compiler 5，ARM Compiler 6

ARMCC即ARM Compiler 5（AC5）为MDK5的默认编译器,armcc支持到Armv7架构，下载地址[Legacy Arm Compiler 5, 4.1, and RVCT (ACOMP5)](https://developer.arm.com/downloads/view/ACOMP5)

[《 Arm Compiler 5.06 》\_\_ARM编译器官网下载、安装和使用说明（小白也能懂）\_逢场作戏L的博客-CSDN博客](https://blog.csdn.net/weixin_44807874/article/details/128627528)

[ARM compiler 5/6 的安装和选择\_安装arm 6 编译器\_ZhonyC的博客-CSDN博客](https://blog.csdn.net/ZhonyC/article/details/120453947)

ARMCLANG即ARM Compiler 6(AC6)，armclang可以支持Armv6,Armv7, Armv8以及今后Arm的新处理器。

一般安装MDK5默认两个编译器都安装了，ARM\ARMCC文件夹下即AC5，ARM\ARMCLANG文件夹下即AC6,一般选择AC5因为AC6可能会出现编译错误

[ARM学习（9） arm 编译器了解学习（armcc/armclang）\_arm编译器\_张一西的博客-CSDN博客](https://blog.csdn.net/qq_34430371/article/details/125820927)

[Keil切换到armclang编译器，到底强在哪里？ - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/421369236)
