freeRTOS移植——ZYNQ7000简介

ZYNQ 7000使用AMR CortexA9 CPU,移植freeRTOS之前首先需要了解它的基本结构和配置,侧重于一下几点

·       寄存器分布

·       中断配置

·       配套的汇编指令集

·       IRAM和DRAM

PS:关于ARM的学习,个人认为,最好是以项目为驱动,为自己设定一个小项目,诸如这里讨论的移植freeRTOS,或是经典的跑马灯实验。基于设定的项目,直接去ARM官网上查找相应资料,其中英语可能会成为较大的阻碍,这就需要好好自己好好提升英语能力了。有人可能觉得百度或者各种中文论坛也不错,但我这次移植也去用了用,资料较少,而且大部分都相互抄袭,没有太多影响,作为入门的科普还行,想要进一步做项目还是得去官网。

 

硬件架构

ARM Cortex A9为双核结构,如下图所示,之前说的sector即为下图中的APU


其中只需要重点关注,

·        ZYNQ 7000拥有两块ARMCortex A9 CPU,运行主频可配(我用的666.66667MHz)。

·        每块CPU都对应有32KB的ICache和DCache,它们共享512KB的L2 Cache和256KB的SRAM。

·        输入到sector的中断由GIC模块管理。

 

寄存器

ARM Cortex A9 CPU共计有37个寄存器,如下图所示,


其中

·        ARM Cortex A9 CPU有多种运行模式,不同模式下访问的寄存器是不同的,RTOS的移植只关注其中几种

·       用户模式(user mode),正常运行模式,

·       系统模式(system mode),具有系统特权的运行模式

·       中断模式(IRQ mode),处理中断的运行模式

·       监督模式(Supervisor mode),OS保护模式,处理系统复位和软件中断的模式

·        寄存器分为通用寄存器和分组寄存器两类

·       R0~R7为通用寄存器,所有CPU运行模式下,CPU访问的R0~R7都是同一样的寄存器,都是R0_user~R7_user

·       R8~12在FIQ mode下,为R8_fiq~R12_fiq;其他模式下为R8_ user ~R12_ user,由此可见,FIQ的处理是可不需要压栈和出栈。

·       SP和LR,在user mode和system mode下为SP_user和LP_user,其他模式都为自己独有的寄存器SP_xx和LP_x,SP作为stack pointer register使用,LR用于存放函数调用时子函数执行完成后的指令返回地址。也被记为R13和R14

·       PC为通用寄存器,存放当前CPU下一步需要从ICache中取出的指令位置,其为当前执行的指令地址+x(CPU会提前取出多条指令优化排序执行),x为8(针对ARM指令)或4(针对Thmbr指令),也被记为R15

·       CPSR为当前CPU状态寄存器,其是通用寄存器

·       SPSR为CPU状态保存寄存器,除usermode和system mode外,每种模式都有自己独立的状态保存寄存器

 

汇编指令

ARM Cortex A9 CPU使用的汇编指令集为ARMv8,可以在其官网上找到相关文档,或者搜索相关指令,网址是:https://developer.arm.com/。文档非常冗长,建议是找个现成的汇编小程序,一边阅读一边查指令含义,如此可以很快地掌握常用指令。

ARM指令集大致分为如下几类

汇编其中使用的寄存器名如下图所示(实际上改为小写也行)


除此之外,ARM的汇编指令还可以操作协处理器(NEON)的寄存器,它们的名称如下,


中断

ARM Cortex A9 CPU可处理的中断分为SGI、PPI和SPI三类

·        SGI,中断ID 1~15,为软件触发中断

·        PPI,中断ID 16~31,为私有中断,

·        SPI,中断ID 31~95,为共享中断,

它们都由GIC进行管理,我们可以通过对GIC的配置来管理所有的中断。

 

BSP

ZYNQ 7000往往使用XILINK的SDK进行开发,其提供了一个名为BSP的软件工程用于封装硬件,可以简单地理解为硬件驱动库。如下图所示,它向OS和业务代码提供功能接口。实际上,BSP和OS我们往往将其通称为平台。


XILINX提供的BSP比较庞大,包含了CPU所有相关硬件的驱动程序。这里我们只关心FreeRTOS的移植中要使用的中断向量表和定时器。

对于中断向量表,可以在BPS中找到如下默认设置的中断向量表_vectors_table


其中我们需要重点关注78行的SVCHandler和82行的IRQHandler,它们分别对应任务切换的中断和OS提供给用户的中断(包括用于时间片的中断)。

但是该中断向量表定义的ISR并不能够用于支撑freeRTOS,需要进行改写。

 

 

PS:这里83行和84行的IRQ和FIQ都可用于OS提供给用户的中断,它们分别对应CPU的IRQ和FIQ模式,我们暂时只使用IRQ。

 

附:

中断向量表的加载在boot过程中完成,其中vector_base为取值为_vectors_table的宏


SVC的ISR函数如下



IRQ的ISR函数如下,可见其是不能支持退出中断后的任务切换,需要进行改写。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章