历史上的今天
返回首页

历史上的今天

今天是:2025年04月11日(星期五)

正在发生

2018年04月11日 | 将μC/OS-II移植到AndesCore™ N1033A-S处理器

2018-04-11 来源:eefocus

    μC/OS-II是一种代码公开、可裁剪的嵌入式实时多任务操作系统。该内核通过实现抢占式任务调度算法和多任务间通信等功能,使之具有执行效率高、实时性能优良等特点。另外,其占用空间非常小(最小可裁剪至2KB)并且具有高度可移植性,因此被广泛的应用于微处理器和微控制器上。

    晶心科技 (Andes)作为亚洲首家原创性32位微处理器IP与系统芯片平台设计公司,推出的AndesCore™ N10系列产品N1033A-S, 搭配应用广泛的嵌入式实时操作系统μC/OS-II以及相关的软硬件开发资源,有效的帮助客户降低现有成本、提升系统效能、减少系统功耗,并缩短产品开发上市时程。本文将介绍如何将μC/OS-II移植到AndesCore™ N1033A-S处理器上。


    1. 开发环境及处理器介绍

    1.1 软/硬件开发环境

    本移植过程使用的软件环境是AndeSight? v1.4集成开发套件,它是晶心科技最新推出的针对各种AndesCore?的软件集成开发环境,包括编译器、调试器、分析器以及强大的ESL工具。硬件平台采用晶心科技的FPGA评估板ADP-XC5,该评估板采用AndesCore? N1033A-S作为处理器内核,并具有丰富的片上资源。

    AndesCore™ N1033A-S介绍

    AndesCore™ N10系列产品N1033A-S是一款哈弗结构的32位RISC处理器内核,具有5级流水线(pipeline)及动态分支预测(DynamIC branch preDICTION)架构。N1033A-S新加入了最新AndeSTar™ V2 指令集,把CPU效能推至1.66DMIPS/MHz之上。同时还实现完整的Audio指令集,达到完全整合CPU与DSP功能的目标。N1033A-S还支持向量中断模式以及2D 直接内存访问(DMA)功能,更为实时信号处理添增效能。

    2. μC/OS-II在N1033A-S上的可移植性分析

    μC/OS-II具有高度可移植性,目前已经移植到近40多种处理器体系上,涵盖从8位到64位的各种CPU(包括DSP)。

    μC/OS-II的正常运行需要处理器平台满足以下要求: 1)处理器的C编译器能产生可重入代码;2)用C语言就可以打开和关闭中断;3)处理器支持中断,并且能产生定时中断;4)处理器支持能够容纳一定量数据的硬件堆栈;5)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

    AndesCore? N1033A-S内部提供了32个通用寄存器,其中R31被用来做专门的堆栈指针。32根地址线最多可访问4GB存储单元,因此只要系统RAM空间允许,堆栈空间理论不会产生限制。N1033A-S处理器提供的AndeStar? V2指令集包含了丰富且十分高效的对堆栈进行操作的指令。例如指令SMW(store multiple word)可实现仅使用一条指令将多个寄存器的值存储到堆栈中并同时更新堆栈指针位置,而且还能很好的处理地址非对齐字的存取。N1033A-S支持中断并能产生定时器中断,处理器中的PSW(Processor Status Word)寄存器中包含一个全局中断禁止位GIE,控制它便可实现打开和关闭中断。此外,AndeSight?集成开发环境中内置的编译器可以产生可重入代码,并且支持内联汇编,C环境中可以任意进行开关中断的操作。综上所述,μC/OS-II完全可以移植到N1033A-S上运行。

    3. 移植步骤

    为了方便移植,大部分的μC/OS-II代码是用C语言写的,用户只需要用C语言和汇编语言写一些与处理器相关的代码就可以实现移植。这部分工作的内容包括:一个完成基本设置的头文件os_cpu.h、一个与处理器相关的汇编文件os_cpu_a.S和一个与操作系统相关的C代码文件os_cpu_c.c.

    3.1在os_cpu.h中完成基本的配置和定义

    3.1.1. 定义与处理器相关的数据类型

    为保证可移植性,μC/OS-II没有直接使用C语言中的short、int和long等数据类型的定义,因为不同的处理器有不同的字长。对于N1033A-S这样的32位处理器,其数据类型定义实现如下:

3.1.2. 定义中断禁止/允许宏

做为实时内核,μC/OS-II需要先禁止中断再访问代码临界区,并且在访问完毕后重新允许中断。μC/OS-II定义了两个宏来禁止和允许中断:OS_ENteR_CRITICAL()和OS_EXIT_CRITICAL()。在N1033A-S处理器上的实现代码如下

GIE_SAVE 和GIE_RESTORE的实现如下:

中断禁止时间是判断系统实时性的重要指标之一。中断禁止时间能否达到最短,不仅与操作系统的设计有关,还依赖于处理器结构和编译器产生的代码质量。从上面的实现代码看到,由于Andes处理器提供了setgie.d和setgie.e两条直接控制中断的开关的指令,整个禁止/允许中断的过程经过编译器产生的机器码只有3/2条,最大限度地减小了中断禁止时间。

3.1.3. 定义栈增长方向

μC/OS-II使用结构常量OS_STK_GROWTH来指定堆栈的增长方式,设置为0表示堆栈从下往上增长,设置为1表示从上往下增长。这里我们定义成后者,即堆栈的增长方向是从内存高地址向低地址方向递减并且堆栈指针总是指向栈顶数据:

3.1.4.定义OS_TASK_SW()宏

OS_TASK_SW()是一个宏,它在μC/OS-Ⅱ从低优先级任务切换到最高优先级任务时被调用的。任务切换只是简单的将处理器寄存器保存到将被挂起的任务的堆栈中,并且将更高优先级的任务从堆栈中恢复出来。可采用两种方式定义这个宏,使用软中断将中断向量指向OSCtxSW()函数;或者直接调用OSCtxSW()函数,这里我们采用后者(OSCtxSW()函数的实现将在后面介绍):


3.2处理器相关部分汇编实现

μC/OS-Ⅱ的移植需要用户编写三个最基本的汇编语言函数:OSStartHighRdy(),OSCtxSw(),OSINTCtxSw()。它们会共用一些代码,为了方便阅读将它们写在同一个汇编文件os_cpu_a.S中。

 

3.2.1 OSStartHighRdy():运行优先级最高的就绪任务。

OSStartHighRdy()函数是在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针SP,并通过SP恢复CPU现场以启动最高优先级的任务执行。另外OSStartHighRdy()还必须在最高优先级任务恢复之前和调用OSTaskSwHook()之后设置OSRunning为TRUE.其实现代码如下:

3.2.2 OSCtxSw()和OSIntCtxSw()

OSCtxSw()是任务优先级切换函数,它的作用是先将当前任务的CPU现场保存到该任务的堆栈中,然后获得最高优先级任务的堆栈指针,并从该堆栈中恢复此任务的CPU现场,使之继续执行,该函数就完成了一次任务切换。

OSIntCtxSw()是中断级的任务切换函数。由于中断可能会使更高优先级的任务进入就绪态,因此为了让更高优先级的任务能立即运行,在中断服务子程序最后会调用OSIntCtxSw()做任务切换。这样做能够尽快的让高优先级的任务得到相应的处理,保证系统的实时性能。

OSCtxSw()和OSIntCtxSw()都是用于任务切换的函数,其区别在于,在OSIntCtxSw()中无需再保存处理器寄存器,因为在OSIntCtxSw()之前已发生中断,所以可以保证所有的处理器寄存器都被正确地保存到了被中断的任务的堆栈之中。OSCtxSw()和OSIntCtxSw()实现代码如下:

N1033A-S处理器定义了四级(0-3)中断,在各级中断的转换时需要保存当前中断层级的寄存器。调用OSCtxSw()时,中断将由0级(即没有中断)转到1级,所以需要将第0级的寄存器PSW和PC保存到第1级的寄存器IPSW和IPC中。CtxSave和CtxRestore两个宏用来保存和恢复任务上下文。需要保存或恢复的寄存器包括32个通用寄存器(R0-R31)的值、程序计数器(PC)的值以及处理器状态字寄存器(PSW)的值。宏IntlSwitch n通过修改PSW.INIT的值来切换中断层级。CtxSave和IntlSwitch的汇编实现如下(由于CtxRestore与CtxSave过程类似,这里不做赘述):

3.3 移植C语言编写的几个与操作系统相关的函数

μC/OS-Ⅱ有六个与CPU相关的函数:OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTimeTICkHook(),它们被定义在ucos_ii.h中。其中唯一必须移植的函数是任务堆栈初始化函数OSTaskStkInit(),其它五个函数必须得声明但没必要包含代码。因此这里我们只介绍OSTaskStkInit(),其代码的实现如下:

OSTaskStkInit()在任务创建时被调用,负责初始化任务的堆栈结构并返回新堆栈的指针,使得堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。除了要保存任务的地址、变量的指针以及处理器状态字的值外,Andes N1033A-S处理器还要求用户保存所有32个通用寄存器(R0-R31)、四个用户寄存器(d0.hi, d0.lo, d1.hi, d1.lo)。还有一点需要注意,在N1033A-S处理器中,堆栈指针的地址必须满足8Byte对齐,程序最后一段逻辑即将堆栈指针调整到正确的位置,这一点在编写其他代码例如在宏CtxSave中同样需要注意。

4. 结语

基于AndesStar?架构的优势,可以很容易的实现μC/OS-Ⅱ在N1033A-S处理器上的移植。不仅μC/OS-Ⅱ,其它嵌入式操作系统也可以很方便地移植到AndesCore?相应的处理器上,例如Nuclues、FreeRTOS以及Contiki。

晶心科技利用 AndesCore? N1033A-S高效能的 Audio ISA 和 FPGA开发平台弹性的设计架构,基于各种RTOS,为客户提供了的丰富的软件资源(中间件、优化的函数库、应用实例等)以及完整的多媒体语音解决方案,从而帮助客户更快地在Andes平台上进行产品开发。


推荐阅读

史海拾趣

安普康(AMPCOM)公司的发展小趣事

在电子行业竞争日益激烈的背景下,安普康深知创新是企业发展的核心动力。因此,公司始终将研发投入作为重要战略之一。通过引进先进的生产设备和技术,安普康不断提升产品的品质和性能。同时,公司还积极与国内外知名企业和研究机构合作,共同开展技术研发和创新。这些努力使得安普康在光纤产品、布线产品等领域取得了多项专利,并成功推出了一系列具有市场竞争力的新产品。

Elpida Memory公司的发展小趣事

尽管有政府的支持,但Elpida Memory的经营状况并未得到根本性的改善。在经历了多年的亏损和重组后,Elpida Memory最终于2012年被美国的美光科技(Micron Technology)收购。这一收购标志着Elpida Memory正式退出了日本半导体产业的舞台,但也为其未来的发展提供了新的机遇。

GS Technology公司的发展小趣事
在物理、化学等科研实验中,用于观察和记录实验数据的峰值。
CoolerMaster公司的发展小趣事

林仁政跳出已有的框架,不断思考机箱的设计。他敏锐地觉察到人们对于免工具安装的主板散热片的偏好,并深知散热效果不仅仅取决于散热片和风扇,更需要考虑空气的流动情况。结合日本高水准的立体设计灵感,林仁政带领工程师挑战困难,成功设计出了一台铝制机箱。这一机箱不仅具有高度的创新性,更因其纯手工制作的特性而显得弥足珍贵,对Cooler Master的发展具有重要意义。

台湾岱恩(DAIN)公司的发展小趣事

随着业务的不断发展,Cooler Master逐渐将触角延伸至全球。集团总部位于中国台北,同时在大陆设立了制造基地,并在北美、欧洲、东亚及北京、上海等地设有办事处或研发中心。这种全球化的布局使得Cooler Master能够更好地了解各地市场的需求,进而提供更加精准的产品和服务。此外,公司还与多家全球500强品牌合作,为其提供散热解决方案,进一步巩固了其在全球散热领域的领导地位。

Fujisoku Corporation公司的发展小趣事

“未来电子”深知人才是企业发展的第一资源。因此,公司高度重视人才培养和团队建设工作。通过建立完善的培训体系、激励机制和晋升通道,公司吸引并留住了一大批优秀的研发、生产和销售人才。这些人才在各自的岗位上发挥出色,为公司的快速发展提供了有力保障。同时,“未来电子”还注重团队合作和跨部门协作,通过组织丰富多彩的团队建设活动,增强了员工的归属感和凝聚力。

问答坊 | AI 解惑

功放图纸

皇冠电路图…

查看全部问答>

USB到串口的转换

采用cp2102芯片实现USB到串口的转换 该芯片集成内部振荡器,无需任何外围器件就能实现usb到串口的转换…

查看全部问答>

GateDriveDesignTips-Ridl

GateDriveDesignTips-Ridl…

查看全部问答>

ISP测试情况反馈

可能标题写得不对,有点个人的主观。引起大家误会了。主要是我们目前也没有找到根本的原因。也是希望大家一起讨论,把ISP解决。…

查看全部问答>

单片机资料大全

不看后悔,多年积蓄,一并发出…

查看全部问答>

关于TC9012芯片解码·问题

void xianshi(void)//红外散转 { //Q=1; switch(zijie[2])//散转 {                                      & ...…

查看全部问答>

写了DYP-ME003红外报警程序,发现不对,求指导啊

#include #define uchar unsigned char #define uint unsigned int sbit hw=P0^0; sbit kz=P0^1; sbit red=P2^7; sbit greed=P2^4; sbit bj=P2^1; sbit ml=P2^0; uchar num; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0 ...…

查看全部问答>

关于不锈钢字标识标牌制设计理念

简单的创意和构思理念,然后使用恰当的艺术或概括的表现手法,使之精品不锈钢字标识标牌更具,有灵性、力量感、视觉感。是我们设计精品不锈钢字标识标牌所必备的。具体方法如下:   一、首先明确使用精品不锈钢字标识标牌的目的、及适用应用范 ...…

查看全部问答>

ADI笔记电流源方案与电路

本帖最后由 paulhyde 于 2014-9-15 03:52 编辑 ADI中文应用笔记  …

查看全部问答>

收到了Intel的钥匙串

收到了“钥匙扣” 说好的钥匙扣,可是没有扣具。只有环和装饰牌, 仔细看,有Intel字样的那块与另外三块所采用的工艺方式是不同的。 其实还是挺好的一个东西,尤其Intel商标,感觉很高端 …

查看全部问答>