8051 与 AndesCoreTM 的软件差异与移植
long | 32-bit | 32-bit | |
long long | 64-bit | N/A | |
float | 32-bit | 32-bit | |
double | 64-bit | 32-bit | 8051 has no 64-bit floating point type |
long double | 64-bit | N/A |
在链接完成后数据通常都会按照本身的属性对齐,比如 int 类型则会 4 bytes对齐,short 则会 2 bytes 对齐。这样的存放方式可以提高 CPU 对数据读取时的 效率。虽然 AndesCore?是 32bit 的 CPU, 在只需要 8bit 和 16bit 的数据时能 节省存储空间,但在处理 16bit 和 32bit 的数据上则有更高效。
在 8051 中有 sbit 关键字用于设置对特殊功能寄存器 SFR 的直接访问,8051的特殊功能寄存器分布在内存地址 0x80 到 0xFF 处,如下表:
F8H | FFH | |||||||
F0H | B * | F7H | ||||||
E8H | EFH | |||||||
E0h | ACC * | E7H | ||||||
D8H | DFH | |||||||
D0H | PSW * | D7H | ||||||
C8H | T2CON * | RCAP2L | RCAP2H | TL2 | TH2 | CFH | ||
C0h | C7H | |||||||
B8H | IP * | BFH | ||||||
B0h | P3 * | B7H | ||||||
A8h | IE * | AFH | ||||||
A0H | P2 * | A7H | ||||||
98H | SCON * | SBUF | 9FH | |||||
90H | P1 * | 97H | ||||||
88h | TCON * | TMOD | TL0 | TL1 | TH0 | TH1 | 8FH | |
80H | P0 * | SP | DPL | DPH | PCON | 87H |
sbit 是 8051 扩展的变量类型,非标准 C 语法,移植的时候需要将其修改成标准 C 操作语法,另外在 AndesCore?中,所有的寄存器都是单独存在的,不 会占用内存的空间。
2.7. 指针使用差异
8051 中两种类型的指针,分别是存储器指针和通用指针,通用指针由 3 个字 节组成,第一个字节用来指明对应的内存类型,所以这种类型的指针类型占用空 间更大也更慢,存储器指针只能用来访问指定类型的存储器空间。
通用指针: 通用指针的声明和标准 C 语言中一样 char *s; /* string ptr */ int *numptr; /* int ptr */ long *state; /* long ptr */ 存储器指针: char data *str; /* ptr to string in data */ int xdata *numtab; /* ptr to int(s) in xdata */ |
而在 AndesCore?上指针不会有这方面的限制,它是一个 32bit 的数据,普通的寄存 器就 可以 存放指针 内容 ,可 以访问到 系统 4G 范围内的 空间 (N705,N801 地址空间只有 16M,N968A 以上的 CPU 地址空间可达 4G)。
2.8. 函数声明差异
在 8051 中由于堆栈空间有限,如果有函数是可重入的,需要在函数声明的 时候用关 键字 reentrant 做说明。 8051 的中断处理 函数则 需要 使用关键字 interrupt 声明,中断处理函数有时也需要用 using 关键字指明哪一寄存器组会被 使用到。
在 AndesCore?中,都采用标准的 C 语法,在声明函数时并不需要这些附加 的声明。AndesCore?遵行底层的 ABI 机制,编译器处理底层的寄存器及堆栈相 关机制。对于上层用户来说是透明的。
3. 系统相关事项说明
3.1. 操作模式
8051 只有一种 mode,AndesCore?有两种 mode,分别是 superuser mode 和 user mode,当系统上电启动时是在 superuser mode,或者当系统进入到中 断或者异常时也进入到 superuser mode,当从中断或者是异常返回后,会返回到 user mode。由于 8051 没有 mode 切换的问题,所以在移植的时候只需要理 解 AndesCore?在 mode 方面的机制就可以。
3.2. 系统的启动
8051 和 AndesCore?的系统启动过程类似,通常在 0 地址存放中断向量表, 第一个向量表是 reset,当系统上电或者是 reset 后,经过该向量会跳转到一个 启动函数中,该启动函数会完成系统启动所必要的步骤,比如设置 CPU,初始 化 SoC,清理内存,初始化 C 运行环境等, 最后完成所有的准备后跳转到 main 函数。
3.3. 中断处理
8051 有 5 个中断源,通常中断向量表只是一个跳转,会跳到真正的中断处理 函数,8051 只能设置成两级的中断优先级。
中断源 | 中断向量 |
上电复位 | 0000H |
外部中断 0 | 0003H |
定时器 0 溢出 | 000BH |
外部中断 1 | 0013H |
定时器 1 溢出 | 001BH |
串行口中断 | 0023H |
AndesCore?包含了 9 个内部异常,中断向量号对应于从 0 到 8, 9 之后对应于外部中断,在 Internal VIC (IVIC)mode 时可支持 32 个外部中断,
Entry number | Entry point |
0 | Reset/NMI |
1 | TLB fill |
2 | PTE not present |
3 | TLB misc |
4 | TLB VLPT miss |
5 | Machine Error |
6 | Debug related |
7 | General exception |
8 | Syscall |
9 | HW0 |
10 | HW1 |
11 | HW2 |
12 | HW3 |
… | … |
40 | HW31 |
当 External VIC(EVIC) mode 时由外部中断控制器决定,最多有 64 个。
Entry number | Entry point |
0 | Reset/NMI |
1 | TLB fill |
2 | PTE not present |
3 | TLB misc |
4 | TLB VLPT miss |
5 | Machine Error |
6 | Debug related |
7 | General exception |
8 | Syscall |
9-72 | VEP 0-63 |
中断的处理由以下几部分组成:
1. 实现中断处理函数
可以用汇编实现 8051 的中断处理函数,也可以用 C 来实现,在 8051中 C 实现
andes andescore 8051 MCU 相关文章:
- EDM安全访问机制应用方案(02-12)
- 在晶心平台运行具 OSC 的 FreeRTOS(01-08)
- Andes SAG应用实例(12-04)
- Andes 的分散聚合(SAG)机制(09-22)