完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1. 8051与AndesCoreTM
本文将介绍使用8051与AndesCore?差异事项,并对两种CPU系统相关事项做说明,后面再介绍从 8051移植到AndesCore ?上注意事项,举中断向量表及异常处理函数的例子说明差异及移植,最后简要介绍AndesCore?在MCU应用的三款CPU: N705,N801 和N968A。 2. 8051与AndesCore常见差异事项 2.1. 位宽的差异 位宽是指处理器一次执行指令的数据带宽。8051 是8 位宽的处理器, 而AndesCore?是32位宽的处理器,支持32位与 16位的混合指令集,位数越宽,在数据的处理方面就更有效率。 2.2. 指令差异 8051 汇编语言共有111 条指令集,AndeStar?的V3m指令集有 157 条,AndeStar?的V3指令集有 200 多条,两种 CPU的指令集大概可以分为以下几类:算术运算,如加,减,乘,除等操作;数据传送,如数据在寄存器,内存间的传送,赋值等;逻辑跳转,如函数呼叫,无条件跳转,条件跳转,中断返回等;在AndesCore ?中还有特权模式的指令部分,关于两种指令集的具体差别,可以分别参考对应的指令集介绍文档。 2.3. 地址空间映射差异 AndesCore?使用memory map 方式映射地址空间,主要有两种,内存的空间映射,如其中的RAM或ROM地址,它们用于存放程序运行时的代码和数据,在AndesCore?上代码在link 后,程序运行的代码和数据地址会最终确定,Andes 提供了一个简便的 link script 工具sag ,可以很方便的对系统中可用的内存空间进行分配设定。 另一个是外设所对应的地址空间,可以通过查看SoC 对应的手册了解对应的外设映射的空间范围及相应的使用方法。 2.4. 堆栈设置差异 8051的堆栈的起始位置是固定的(部分衍生 8051可以做程序设定),它通常固定在片内的RAM中,8051 内存空间有限,非常小,程序中所使用的变量存放于特定的数据空间中,并不会放在堆栈空间,所以在 8051中所需要的堆栈空间很小。而对于 And esCore?来说,堆栈可以设置在任意合适的 RAM上。程序运行时所有的局部变量都存放在堆栈中,只需要确保在设计系统的时候有足够的堆栈空间。在 AndesCore?中有$ sp寄存器表示栈顶位置,这需要在系统上电或者是系统reset 后初始化时进行设置。 2.5. 代码和数据的存储差异 在8051 系列单片机中,数据存储区可以分为内部数据存储区以及外部数据存储区。 内部数据存储区有几个区别:data ,bdata,idata。 data : 片内RAM直接寻址区。bdata: 片内RAM位寻址区。idata: 片内 RAM间接寻址区。 外部数据存储区又有:xdata,pdata。 xdata 和pdata:是外部存储区,有些芯片会带有 XRAM 。 在有些开发工具中,如K eil,可以通过设置存储模式来处理,存储模式决定了默认的存储器类型, 此存储器类型将应用于函数参数, 局部变量和定义时未包含存储器类型的变量。 SMALL 所有的变量存放在片内 RAM(data 区间) COMPACT 所有的变量存放在外部存储区(pdata 区间) LARGE 所有的变量存放在外部存储区(xdata 区间) AndesCore?以内存映射的方式,内存空间不会有特别的限制,就是说不会像8051那样需放在某处区间,这样的设计更方便灵活,允许程序代码和数据在可用的空间里自由放置。 有时候需要将某段代码或者数据存放在指定的位置上,在8051 中,可以在代码中使用“at” 关键字,但该关键字是 8051 中所特有的,会造成可移植性和维护的问题,在 AndesCore?上,提供了一种简便的 link script 工具,如上所提到的sag 工具,在 C 代码中使用GNU标准的语法格式,在 link 之后相应的代码和数据将存放于指定的位置,这样可以避免在代码中使用“at” 该平台相关的属性设置。 2.6. 数据类型及对齐差异 8051和AndesCore ?是不同类型的CPU,它们所使用的数据类型所对应的宽度也不同,如下表所示: 在链接完成后数据通常都会按照本身的属性对齐,比如int 类型则会4 bytes对齐,short则会2 bytes对齐。这样的存放方式可以提高 CPU对数据读取时的效率。虽然AndesCore?是32bit的CPU, 在只需要8bit 和16bit的数据时能节省存储空间,但在处理16bit 和32bit的数据上则有更高效。 在8051中有***it 关键字用于设置对特殊功能寄存器 SFR的直接访问,8051的特殊功能寄存器分布在内存地址0x80到0xFF处,如下表: ***it 是8051扩展的变量类型,非标准 C 语法,移植的时候需要将其修改成标准C 操作语法,另外在AndesCore?中,所有的寄存器都是单独存在的,不会占用内存的空间。 2.7. 指针使用差异 8051中两种类型的指针,分别是存储器指针和通用指针,通用指针由3 个字节组成,第一个字节用来指明对应的内存类型,所以这种类型的指针类型占用空间更大也更慢,存储器指针只能用来访问指定类型的存储器空间。 而在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只能设置成两级的中断优先级。 AndesCore?包含了9 个内部异常,中断向量号对应于从 0 到8, 9 之后对应于外部中断,在Internal VIC (IVIC )mode时可支持32个外部中断, 当External VIC(EVIC) mode时由外部中断控制器決定, 最多有64个。 中断的处理由以下几部分组成: 1. 实现中断处理函数 可以用汇编实现8051 的中断处理函数,也可以用C 来实现,在8051中C 实现的中断处理函数会有一个“interrupt” 的关键字,如果有寄存器 bank被使用到,还要加上“using”关键字。如果要将中断处理函数固定在特定位置还需要使用“at” 关键字,而 AndesCore?使用的是标准的 C 语法,不需要为中断处理函数做这些设置。 2. 中断向量表的产生 8051 中断向量表摆放在 0 开始的位置,在AndesCore?中硬件可以设定启动地址,通常设为 0 地址,也可以是非 0 地址,中断向量表存放在对应系统启动地址处。在程序编写过程中可以通过标准的gnu 语法再加上link script 的sag 工具,以使产生的中断向量表在链接的时候存放于特定的位置。 3. 中断配置 在8051中,需要做以下设置 1. IE 寄存器中Individual Interrupt Enable 位设1 2. IE 寄存器中EA(Enable All)位设1 3. 当是外部中断时,配置相关的pin 为输入,并设置对应的触发属性为edge或level 触发。 而在AndesCore?中需要做以下设置: 1 。设置CPU IVIC 或者 EVIC mode 2 。设置INT_MASK位 3 。设置中断的优先级 4. 关于异常处理差异 在8051中没有异常处理向量,所以在8051中并没有这部分的处理函数,在AndesCore?中有一些系统的exception 中断向量,比如Machine Error,GeneralException, 建议在AndesCore ?上实现对应的处理函数, 当发生这类异常时做一些基本的处理。 3.4. 时序和延迟 在8051中可以采用NOP指令来延迟,在 AndesCore?中也有NOP指令来达到类似目的。 3.5. 电源管理 8051 单片机中有两种省电方式,分别是空闲方式和掉电模式, 单片机处于空闲工作方式时,CPU处于睡眠状态,它的片内其它部件还是会继续工作,片内RAM的内容和所有专用寄存器的内容在空闲方式期间都被保存下来了, 可以通过中断或者硬件复位来终止空闲工作方式。单片机处于掉电工作方式时,片内的振荡器停止了工作,因此它的一切都被迫停止了。但片内 RAM的内容和专用寄存器的内容一直保持到掉电方式结束为止。掉电方式的唤醒方式只有一种,就是硬件复位。 在AndesCore?上,可以通过软件standby 指令使CPU进入到低功耗模式,通常标准c 代码并不能直接控制硬件,Andes 的compiler 提供了intrinsic 函数来做到这点。分别是:__nds32_standby_no_wake_grant(), __nds32_standby_wake_grant(),__nds32_standby_wait_done()。指定系统进入低功耗模式时被唤醒的方式,分别是外部中断中断唤醒,电源管理模块唤醒,和中断配合电源管理模块唤醒,可以根据系统需要分别设计。 4. 从8051移植到AndesCore上注意事项 一个8051工程,当移植到AndesCore?上时有以下注意事项: 1. 内存映射,代码和数据摆放位置相关的设置。 2. 可以不必考虑变量数目,或者是函数的overlay, 因为在32bit 的AndesCore?上开发时内存空间通常不会像 8051那样小。 3. 如果空间允许,在 AndesCore?上尽量使用32bit的数据类型,这样效率会更高。 4. 在8051上用于表示内存区域属性的标志如(idata, xdata, bdata, pdata 等)在AndesCore?上可以移除。 5. 在8051上不需要设置内存区块模式,比如:small, compact, large 等。 6. 在8051 上用于表示对像远近的属性“near” 和“far”,都可以移除,AndesCore?上的指针的访问可以达到所有地址空间。 7. 在中断处理函数中不需要像8051那样指定哪块寄存器块会被用到的关键字“using”。 8. 在8051上中断处理函数就和普通的函数一样,中不需要设置其它的关键字,如interrupt 。 9. 如果有8051汇编部分移植到 AndesCore?,需要重新实现,尽可能的用c 来实现,便于维护和调试。 10. 在8051中使用到的#progma 相关部分需要删除。 11. 在AndesCore?中函数不需要声明为“reentrant” 属性。 12. 如果使用了数学运算,在8051中默认是使用32bit单精度浮点,如果要 保持和8051 中相同的精度,需要将函数名做一些调整,如将 sin() 改成sinf()。 5. 中断向量及异常处理函数例子 以中断向量及中断处理函数的例子说明差异及移植。 5.1. 汇编实现中段向量表 [8051] 该例子显示怎样用汇编设置8051的中断向量和中断处理函数,在8051汇编中ORG指定了后面汇编代码的位置,后面的中断向量通常是一个跳转语句。如下例第一个向量跳到主函数MAIN函数中,另外一个外部中断1, 也是一个跳转指令:LJMP INT 到后面的用汇编实现的中断处理函数 INT 中。 [ AndesCore?] 该例子显示怎样用汇编设置AndesCore?的中断向量表和中断处理函数, 该例子中exception_vector 是中断向量表的label, 后面分别表示第0,1,2,3…个中断向量,它们只是简单的跳转指令,跳到具体的执行实体中去,如vector 0 跳到_start, 做系统相关的初始化操作,_start 是系统启动代码,用汇编语言来实现。vector 9 后面对应的是外部中断,中断处理函数如OS_Trap_Interrupt_HW0,OS_Trap_Interrupt_HW1… 它通常用C 来实现,可以参考后面5.2 章节的AndesCore?中断处理函数范例。 在上面用汇编设置AndesCore?的中断向量表的例子中,我们需要将中断向量表最终设定在0 地址处,可以通过 section语法配合sag 工具实现,例子中我们设定该段的 section 名为.vector, 所以在sag 中,我们自定义一个 USER_SECTION 为.vector,并 将.vector放在0 开始的地方并作为第一个 section。 通过上面的sag 语法,并使用andes 提供的sag 转ld 的工具,可以产生类似以下的ld ,在工程进行链接的时候选择该 ld 时就能确保 .vector链接的地址位于0 处。 关于详细的SAG使用,可以参考我们的另一篇文章:《Andes 的分散聚合(SAG)机制》 5.2. 中断处理函数的C 实现 6. 适用于MCU的Andes CPUs Andes 有三款非常适用于 MCU应用的CPU,分别是:N705,N801,N968A,如下图所列: N705和N801分别采用了两级和三级流水线,都具有很低的功耗和很好的性能,当应用需要的频率较低时,使用两级流水线的N705能发挥出更好的性能和更低功耗的特性,相比于8051,两级流水线的 N705 在频率方面高出许多,比如在TSMC 40nm LP 工艺下能跑到超过240MHz ,所以完全能胜任8051的应用需求。N968A使用了五级的流水线,同样有低功耗的特性和很好的性能,同时该款CPU具有很强的可配置性,如支持多种总线接口,还支持了专门为audio的加速指令,N968A是一个多面手,性能好,功耗低,又具备强大的可配置特性,适合于多种应用。 |
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1106 浏览 1 评论
2473 浏览 5 评论
2808 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2646 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
653浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 09:21 , Processed in 0.963874 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号