嵌入式中volatile

每个成员都使用“volatile”进行了修饰,目的是防止编译器优化。

嵌入式中volatile_第1张图片

“示例代码 17.1.1.1”就是 STM32F103 的中断向量表,中断向量表都是链接到代码的最
前面
,比如一般 ARM 处理器都是从地址 0X00000000 开始执行指令的,那么中断向量表就是
从 0X00000000 开始存放的。“示例代码 17.1.1.1”中第 1 行的“__initial_sp”就是第一条中断
向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依
次类推,直到第 27 行的最后一个中断服务函数 DMA2_Channel4_5_IRQHandler 的入口地址,
这样 STM32F103 的中断向量表就建好了。
我们说 ARM 处理器都是从地址 0X00000000 开始运行的,但是我们学习 STM32 的时候
代码是下载到 0X8000000 开始的存储区域中。因此中断向量表是存放到 0X8000000 地址处
的,而不是 0X00000000,这样不是就出错了吗?为了解决这个问题,Cortex-M 架构引入了一
个新的概念——中断向量表偏移,通过中断向量表偏移就可以将中断向量表存放到任意地址
处,中断向量表偏移配置在函数 SystemInit 中完成,通过向 SCB_VTOR 寄存器写入新的中断
向量表首地址即可。

嵌入式中volatile_第2张图片

SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器
GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信

嵌入式中volatile_第3张图片

抢占优先级指的是可以抢占,子优先级是指不可抢占时,同时到达先响应谁,一直到结束。

 

有关优先级设置的内容就讲解到这里,优先级设置主要有三部分:
①、设置寄存器 GICC_PMR,配置优先级个数,比如 I.MX6U 支持 32 级优先级。

②、设置抢占优先级和子优先级位数,一般为了简单起见,会将所有的位数都设置为抢占
优先级。
③、设置指定中断 ID 的优先级,也就是设置外设优先级。

 

 

嵌入式中volatile_第4张图片

嵌入式中volatile_第5张图片

嵌入式中volatile_第6张图片

嵌入式中volatile_第7张图片

嵌入式中volatile_第8张图片

高精度延时函数的实现肯定是要借助硬件定时器,前面说了本章实验使用 GPT 定时器来实
现高精度延时。如果设置 GPT 定时器的时钟源为 ipg_clk=66MHz,设置 66 分频,那么进入 GPT
定时器的最终时钟频率就是 66/66=1MHz,周期为 1us。GPT 的计数器每计一个数就表示“过去”
了 1us。如果计 10 个数就表示“过去”了 10us。通过读取寄存器 GPTx_CNT 中的值就知道计
了个数,比如现在要延时100us,那么进入延时函数以后纪录下寄存器GPTx_CNT中的值为200,
当 GPTx_CNT 中的值为 300 的时候就表示 100us 过去了,也就是延时结束。GPTx_CNT 是个
32 位寄存器,如果时钟为 1MHz 的话,GPTx_CNT 最多可以实现 0XFFFFFFFFus=4294967295us
≈4294s≈72min。也就是说 72 分钟以后 GPTx_CNT 寄存器就会回滚到 0X00000000,也就是溢
出,所以需要在延时函数中要处理溢出的情况。关于定时器实现高精度延时的原理就讲解到这
里,原理还是很简单的,高精度延时的实现步骤如下:

嵌入式中volatile_第9张图片

嵌入式中volatile_第10张图片

嵌入式中volatile_第11张图片

嵌入式中volatile_第12张图片

 

因此所谓的驱动开发,就是各种外设(定时器,IO,存储器访问等)的使用,把它做成接口,方便上层应用软件调用罢了。

 

那么 SRAM 有什么缺点没有?那必须有的啊,要不然就不可能有本章教程了,SRAM 最大的缺点就是成本高!价格高,大家可以在淘宝上搜索一下 IS62WV51216 这个仅仅只有 1MB
大小的 SRAM 售价为多少,大概为 5,6 块钱。大家在搜索一下 32MB 的 SDRAM 多钱,以华邦
的 W9825G6KH 为例,大概 4,5 块钱,可以看出 SDRAM 比 SRAM 容量大,但是价格更低。
SRAM 突出的特点就是无需刷新(SDRAM 需要刷新,后面会讲解),读写速度快!所以 SRAM
通常作为 SOC 的内部 RAM 使用或 Cache 使用,比如 STM32 内存的 RAM 或 I.MX6U 内部的
OCRAM 都是 SRAM。

嵌入式中volatile_第13张图片

嵌入式中volatile_第14张图片

嵌入式中volatile_第15张图片

 

以上就是 MMDC 的时钟源设置,I.MX6U 参考手册一直说 DDR 的频率为 400MHz,但是
实际只有 396MHz,就和 NXP 宣传自己的 I.MX6ULL 有 800MHz 一样,实际只有 792MHz。

嵌入式中volatile_第16张图片

嵌入式中volatile_第17张图片

 

因此,内存DDR存储芯片配置就是:配置cortex-a的专用DDR控制器,其中有几个专用寄存器的值是需要通过校准获得的。(通过NXP官方给的软件的实验测试得到)。

你可能感兴趣的:(实时系统,cortex-a)