4.1 内核

相关参考资料:技术参考手册和数据手册(要知道技术文档的作用哦)

技术参考手册有关如何使用该产品的具体信息,包含各个功能模块的内部结构、所有可能的功能描述、各种工作模式的使用和寄存器配置等详细信息。 技术参考手册不包含有关产品技术特征的说明,这些内容在数据手册中。//就是说怎么用,相当于使用说明书

数据手册中的内容包括:产品的基本配置(如内置Flash和RAM的容量、外设模块的种类和数量等),管脚的数量和分配,电气特性,封装信息,和定购代码等。//科普一下产品里面都有些啥,相当于产品介绍了

之前零零散散的学,拿到板子就懵逼

拿到板子之后究竟首先该看些啥啊????

参考手册和数据手册?教学视频?(有大佬教教吗)以下这么多文档该用什么节奏学呢?

 说实话我只看视频了,然后去copy别人的代码,东拼西凑勉强跑起来

。。。学一次忘一次,慢慢来吧

开发学什么

作为CM3的使用者,我们选择自己要用的板子时应该看些什么? 这么看?

总结一下就是(已STM32F103C8T6为例)

1.内核的最高工作频率(72MHz)

2.存储器的容量(高达128K字节的闪存和20K字节的SRAM--中等容量)

3.外设(丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和1个PWM定时器,还包含标准和先进的通信接口:多达2个I2C接口和SPI接口、3个USART接口、一个USB接口和一个CAN接口。)

4.引脚(STM32F103xx中等容量增强型系列产品提供包括从36脚至100脚的6种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。)

5.时钟速度(后面讲)

至于其他的

 外中断的数目
 表达优先级的位数(优先级寄存器的有效宽度)
 是否配备了MPU
 是否配备了ETM
 对调试接口的选择(SW, JTAG或两者兼有)

这些还不太懂。。。

以后再说

4.1 内核(了解)

 首先看内核吧,对应的资料应该是Cortex-M3技术参考手册,但我看的是别人精简翻译了的这个

CM3采用经典的哈佛结构

内核本身就很复杂,我觉得初学者没有必要深入了解,这里我们就了解一下它的基本情况就好了 

寄存器组
 操作模式
 异常,嵌套向量中断
 存储器映射
 总线接口
 存储器保护单元
 指令系统
 中断和异常
 调试支持

1.寄存器组

Cortex-M3处理器拥有R0-R15的寄存器组。

1.1 R0-R12:通用寄存器 

R0-R12都是32位通用寄存器,用于数据操作。但是注意:绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb-2指令可以访问所有寄存器。 

1.2 Banked R13: 两个堆栈指针


Cortex-M3拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用(不处于异常服用例程中时)。

要注意的是,并不是每个程序都要用齐两个堆栈指针才算圆满。简单的应用程序只使用MSP就够了。

堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

1.3 R14:连接寄存器

当呼叫一个子程序时,由R14存储返回地址
不像大多数其它处理器,ARM为了减少访问内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在RISC处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。 

1.4 R15:程序计数寄存器 

指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高级技巧就在这里面——译注)。 R15是程序计数器,在汇编代码中一般我们都都叫它的外号“PC”。因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。

1.5 特殊功能寄存器 

Cortex-M3还在内核水平上搭载了若干特殊功能寄存器,包括
程序状态字寄存器组(PSRs)——程序状态寄存器在其内部又被分为三个子状态寄存器:
 应用程序PSR(APSR)
 中断号PSR(IPSR)
 执行PSR(EPSR)
通过MRS/MSR指令,这3个PSRs即可以单独访问,也可以组合访问(2个组合,3个组合都可以)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)——这三个寄存器用于控制异常的使能和除能。


控制寄存器(CONTROL)——控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比特来行使这两个职能。

CONTROL[1]
在Cortex-M3的handler模式中,CONTROL[1]总是0。在线程模式中则可以为0或1。
因此,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模式也有其它的方式:在异常返回时,通过修改LR的位2,也能实现模式切换。这是LR在异常返回时的特殊用法,颠覆了对LR的传统使用方式,将在第5章中展开论述。
CONTROL[0]
仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。 

2.操作模式  

   Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作。
两种操作模式分别为:处理者模式(handler mode,以后不再把handler中译——译注)和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。
Cortex-M3的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

在CM3运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写CONTROL寄存器就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发SVC异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态(也可以手工指定返回的状态——译注)。

当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。
在线程模式+用户级下,对系统控制空间(SCS)的访问将被阻止——该空间包含了配置寄存器组以及调试组件的寄存器组。除此之外,还禁止使用MRS/MSR访问刚才讲到的,除了APSR之外的特殊功能寄存器。如果以身试法,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS空间的,将fault伺候。

特权等级和堆栈指针的选择均由CONTROL负责。当CONTROL[0]=0时,在异常处理的始末,只发生了处理器模式的转换。
在特权级下的代码可以通过置位CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler来修改CONTROL[0],才能在返回到线程模式后拿到特权级。 

3.异常,嵌套向量中断 

 Cortex-M3在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller)。它与内核有很深的“亲密接触”——与内核是紧耦合的。NVIC提供如下的功能:


3.1 可嵌套中断支持

可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在xPSR的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。 


3.2 向量中断支持

 当开始响应一个中断向量表,并且根据中断号从表中找出ISR的入口地址,然后跳转过去执行。这么一来,中断延迟时间大为缩短。举个例子,如果发生了异常11(SVC),则NVIC会计算出偏移移量是11x4=0x2C,然后从那里取出服务例程的入口地址并跳入。要注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后MSP的初值。


3.3 动态优先级调整支持

软件可以在运行时期更改中断的优先级。 


3.4 中断延迟大大缩短

自动的现场保护和恢复,用于缩短中断嵌套时的ISR间延迟。详情请见“咬尾中断”和“晚到中断”。 


3.5 中断可屏蔽

既可以屏蔽优先级低于某个阈值的中断/异常(设置BASEPRI寄存器),也可以全体封杀(设置PRIMASK和FAULTMASK寄存器)。这是为了让时间关键(time-critical)的任务能在死线(deadline,或曰最后期限)到来前完成,而不被干扰。 

4. 存储器映射

//要搞清楚片外外设与片上外设(又称片内外设)的关系

所谓存储器映射,就是将4GB的存储空间预先定义好。通过把片上外设的寄存器映射到外设区,就可以简单地以访问内存的方式来访问这些外设的寄存器,从而控制外设的工作。结果,片上外设可以使用C语言来操作。这种预定义的映射关系,也使得对访问速度可以做高度的优化(//可能是每个区域各司其职,省去了使用同一片空间时的排队等待?),而且对于片上系统的设计而言更易集成(还有一个重要的,不用每学一种不同的单片机就要熟悉一种新的存储器映射——译注)。

Cortex-M3的内部拥有一个总线基础设施,专用于优化对这种存储器结构的使用。在此之上,CM3甚至还允许这些区域之间“越权使用”。比如说,数据存储器也可以被放到代码区,而且代码也能够在外部RAM区中执行(但是会变慢不少——译注)。

处于最高地址的系统级存储区,是CM3用于藏“私房钱”的——包括中断控制器、MPU以及各种调试组件。所有这些设备均使用固定的地址(本书第5章讨论存储器系统)。通过把基础设施的地址定死,就至少在内核水平上,为应用程序的移植扫清了障碍。(//像是中断控制器、MPU以及各种调试组件这些,工作过程中如果耽误或是出错了,会牺牲很大的效率,故而给他们单开VIP房

  • 50
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CentOS是一种基于Linux的操作系统,内核升级是指将操作系统的内核版本升级到更高的版本。在CentOS中,内核升级可以通过以下步骤完成: 1. 确认当前内核版本:可以使用以下命令来查看当前CentOS系统的内核版本: ``` uname -r ``` 2. 下载新的内核源代码:可以从官方网站或其他可信的源获取最新的内核源代码。在下载之前,确保你已经了解了新版本内核的特性和变化。 3. 安装编译工具:在编译新内核之前,需要安装一些必要的编译工具和依赖项。可以使用以下命令来安装: ``` sudo yum groupinstall "Development Tools" sudo yum install ncurses-devel ``` 4. 解压并配置内核源代码:将下载的内核源代码解压到一个目录中,并进入该目录。然后,可以使用以下命令配置内核: ``` make menuconfig ``` 在配置界面中,可以根据需要选择或修改不同的内核选项。完成配置后,保存并退出。 5. 编译和安装内核:使用以下命令编译和安装新的内核: ``` make sudo make modules_install sudo make install ``` 6. 更新引导程序:在安装新内核后,需要更新引导程序以使系统能够引导到新的内核。可以使用以下命令更新引导程序: ``` sudo grub2-mkconfig -o /boot/grub2/grub.cfg ``` 7. 重启系统:完成上述步骤后,可以通过以下命令重启系统以应用新的内核: ``` sudo reboot ``` 请注意,内核升级可能对系统产生一些影响,包括硬件兼容性和稳定性等方面。在进行内核升级之前,请务必备份重要数据,并确保你了解升级过程中的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值