Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Cortex-R
Cortex-R4 移植笔记
发布于 2021-01-29 13:38:10 浏览:1748
订阅该版
[tocm] # Cortex-R4 移植笔记 一款 Cortex-R 芯片的移植工作,该芯片有如下特点: - 属于 Cortex-R 内核 - 芯片默认运行于大端模式 - 有 3M flash 和 256K ram - R4 内核的寄存器组看起来与 Cortex-A 系列一致,同样拥有多种运行时状态和相应的 bank 寄存器组 - 中断系统与先前接触的 STM32 NVIC 和 ZYNQ 的 GIC 都不同,使用的是一种 VIM(Vectored Interrupt Manager (VIM) Module ) 的中断管理器,支持硬件中断跳转(系统提供的一种快速中断响应方式)和软件查表跳转两种方式,其中软件查表方式和我们先前在 Cortex-A 系列中中断的处理方式相似 ### 大端系统的处理 在先前接触到的大部分 CPU,都基于 arm 内核,大多都运行在小端模式,很少遇到运行于大端模式的 CPU,而目前 RTT 中的移植代码,大部分也默认按照小端模式来处理。由于本次移植需要处理的是大端模式的 CPU,因此在移植的过程中遇到了一些奇怪的现象。 在 RTT 操作系统中,当需要进行第一次线程切换前,需要将系统切换到 SVC 模式,然后执行如下代码: ```asm LDMIA sp!, {r4} ; pop new task cpsr to spsr MSR spsr_cxsf, r4 ; pop new task r0-r12, lr & pc, copy spsr to cpsr LDMIA sp!, {r0-r12, lr, pc}^ ``` 这段代码将会从目标线程的栈中读出 CPSR 的值,存入到 SPSR 寄存器中,然后跳转到目标线程的执行代码中运行,跳转的过程中,最后一条命令会自动拷贝 SPSR 的值到目标线程环境下的 CPSR 寄存器中,而 CPSR 寄存器中保存着 CPU 的各种运行状态,这其中也包括了 CPU 是以大端模式还是以小端模式读取数据。 在 RTT 先前的 Cortex-A 系列的移植中,默认都配置成了小端模式,而这次,CPU 运行在大端模式下,一旦 CPU 的大小端模式被改变,很快就会出现莫名其妙的内存访问错误,原因是 CPU 会以小端数据的解析方式来解析大端数据。 ### SYSTEM 模式不会出错 在处理该问题的过程中还有另外一个现象,那就是如果在跳转前不切换到 SVC 模式,系统就不会崩溃,此时系统处于 SYSTEM 模式,该模式是调用该芯片的 HAL 库进行系统初始化后默认的状态。 造成这种情况的原因是,当系统处于 SYSTEM 模式下,这种状态没有 CPSR 和 SPSR 寄存器,如果进行访问操作,会出现未知状态,也就是说 `MSR spsr_cxsf, r4` 这条指令是无效的,不会将相关的状态存入 SPSR 寄存器,系统也就不会切换到小端状态工作。 ### 低中断延时技术 在 Cortex-R4 系列的技术手册中描述了一种低中断延时技术,描述如下: ``` Low Interrupt Latency (LIL) is a set of behaviors that reduce the interrupt latency for the processor, and is enabled by default. That is, the FI bit [21] in the SCTLR is Read-as-One. LIL behavior enables accesses to Normal memory, including multiword accesses and external accesses, to be abandoned part-way through execution so that the processor can react to a pending interrupt faster than would otherwise be the case. When an instruction is abandoned in this way, the processor behaves as if the instruction was not executed at all. If, after handling the interrupt, the interrupt handler returns to the program in the normal way using instruction SUBS pc, r14, #4, the abandoned instruction is re-executed. This means that some of the memory accesses generated by the instruction are performed twice. Memory that is marked as Strongly-ordered or Device type is typically sensitive to the number of reads or writes performed. Because of this, instructions that access Strongly-ordered or Device memory are never abandoned when they have started accessing memory. These instructions always complete either all or none of their memory accesses. Therefore, to minimize the interrupt latency, you must avoid the use of multiword load/store instructions to memory locations that are marked as Strongly-ordered or Device. ``` 从上述描述可知,在 Cortex-R 系列中,默认开启了低延时中断技术,使得在使用多字节内存访问指令时在中间过程中可以被中断。 例如: ```asm VSTMDB sp!, {d0-d15} # 使用 VSTM 指令一次操作向栈中压入多个数据 LDMIA sp!, {r0-r12,lr} # 使用 LDM 指令一次向寄存器中加载多个数据 ``` 在这些指令的执行过程中,如果开启了 Low Interrupt Latency (LIL) 功能,则该过程可能被打断。等到中断处理函数执行完毕返回时,被中断指令(例如 VSTMDB) 将会被再次执行,这就意味着被该指令执行的内存访问操作可能会被执行两次。 如果访问的内存是普通内存,那么被访问两次可能也没有太大问题,但是如果访问的是强序内存或者设备内存,那么对内存的多次访问读写会造成副作用。因此,对于强序内存和设备内存来说,访问操作要么不开始,要么就要完全执行完毕,而不能被中途打断。 如果使用了多数据操作指令访问强序内存或者设备内存,因为该操作指令不能被中断,所以中断触发就要等到内存访问执行执行完毕,而访存操作速度是很慢的,也因此增大了中断响应时间。 所以需要避免使用 multiword load/store instructions 操作强序内存或设备内存,使得中断延时时间最小化。 ## 中断硬件跳转 不同于 A 系列响应中断时需要手动软件查表,在 TMS570 芯片上提供了硬件中断跳转的能力,当中断发生时,会使用硬件的方式读取响应寄存器,找出最高优先级的中断处理函数,然后直接跳转到相应的中断处理函数,整个过程中没有函数调用,节省了函数调用开销,降低了中断响应时间。 在 Cortex-R 系列 CPU 中使用了多种技术来保证系统的实时性,这些特性在先前接触的 M A 系列 CPU 中没有接触过,感觉 R 系列为了保证实时性确实下了不少功夫。
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
20
关注TA
发私信
相关文章
1
VFP_LAZY_STACKING是什么意思?该如何处理呢
2
RTT Cortex R5的移植有谁弄过没?
3
移植ARMV8-r52.
4
r52+ vector代码
5
bsp/renesas/rzt2m_rsk BSP 是否使用了libcpu中的内容
6
libcpu 中 zynqmp-r5/cache.c 中,DCacheFlush 问题
7
TI AM64xx的启动流程
8
你们有没有用过TI的AM64xx这个芯片,我要被这个系统计数器搞晕了
9
RTT移植到cortex-r5核的有人调过吗?在RTT里只有r4核的移植,没有r5的,有谁调过吗?请教一下难度大不大
10
RZ/T2M使用的编译器
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部