uCOS移植(uCOS-II在Microblaze上的移植)

uCOS移植(uCOS-II在Microblaze上的移植)
uCOS移植(uCOS-II在Microblaze上的移植)

随着集成电路设计与制造技术的发展,FPGA芯片的容量越来越大、性能越来越高,用FPGA构建片上系统成为现实,基于FPGA的嵌入式系统与SOPC(System On a Programmable Chip)设计技术将逐渐成为系统设计的主流技术,正获得越来越广泛地研究。Microblaze是Xilinx公司一款针对FPGA器件进行了优化设计的软处理器核,有不错的性能且价格低廉,且支持Xilinx全系列的FPGA器件,应该有着广阔的发展前景。μC/OS-II 是Jean Labrosse先生于1998年推出的一个优秀的开放源码的实时操作系统,具有移植方便、执行效率高、占用空间小、实时性强和可靠性高等优点。采用μC/OS-II+Microblaze的应用平台对中小嵌入式系统应用来说是十分适合的。本文基于μC/OS-II在Microblaze上的移植与基于该系统的应用研究,记录移植和使用过程的心得、体会,内容可能会有些零散,希望对有类似应用的朋友有些帮助,也欢迎大家来交流与讨论。

一、主要参考资料

①μC/OS-II学习主要参考邵贝贝教授译的《嵌入式实时操作系统μC/OS-II(第2版)》

下面是CHINA-PUB的介绍https://www.360docs.net/doc/813808979.html,/12618

网上也有该书第一版的电子书可以找来学习。

② Micrium公司的Micrium-uCOS-II-V286.ZIP,包括代码与文档,可以从

https://www.360docs.net/doc/813808979.html,获得。

③ Micrium公司的μC/OS-II and the Xilinx MicroBlaze Processor Application Note

可以从https://www.360docs.net/doc/813808979.html,获得。

④ Xilinx公司EDK相关文档:https://www.360docs.net/doc/813808979.html,/ise/embedded/edk_docs.htm

⑤ISE、EDK软件的帮助文档,包括MicroBlaze Processor Reference Guide (mb_ref_guide.pdf)。

⑥ EDK的基本使用可以参考:Xilinx官方的6个EDK实验(中文版).pdf

百度文库上有https://www.360docs.net/doc/813808979.html,/view/e92e71d184254b35eefd3425.html

二、操作系统的配置选项问题

在进行Software Platform配置时,一般安装了EDK软件后,操作系统与库设置时可选择的标准选项只有两个:Standalone和Xilkernel。Standalone适合不带操作系统的应用,只提供基本的设置中断,配置Cache等功能,Xilkernel是赛灵思提供的一个嵌入式内核。为了能在设置操作系统时可以选择μC/OS-II,根据赛灵思文档描述,EDK软件的操作系统配置选项其实是通过扫描bsp目录得到,扫描顺序是:

1.当前工作目录,即工程目录。

2.调用Libgen时用–lp选项指定的目录。

3.EDK安装目录下的EDK\sw\lib\bsp目录。

所以我们如果要在所有新建工程时都有μC/OS-II选项,可以把Micrium公司提供的移植包AN-1013.zip里的BSP目录下内容COPY到EDK安装目录下的EDK\sw\lib\bsp目录下就可。如果仅仅是当前工程用的话,把它COPY到工程目录就可以了。

bsp目录有特定的结构,如下图示:

bsp目录下my_os指定我们用的操作系统,这里为uCOS-II_v2_86_a。

my_os目录下面的src目录包括所有的源文件和头文件,data目录包括两个文件: mld文件和tcl文件。mld文件用来定制操作系统的软件库与板级支持包(BSP:Board

Support Packages),tcl文件为产生软件库和BSP包的脚本文件。

三、Microblaze的总线接口

Microblaze处理器提供了以下的总线接口和外部进行通信

① PLB总线:32比特版本的PLB V4.6总线可以支持多个主设备和从设备连接,提供高效率的传输性能,适合于数据传输密集性应用。

② OPB总线:外设总线,适用于低速设备的连接。

③ LMB总线:本地存储总线,用来高速连接片内的BLOCK RAM的同步总线,使用最少数量的控制信号和在一个时钟周期内存取BLOCK RAM的简单协议。LMB总线的读写时序和BLOCK RAM的读写时序是一样的,且所有的LMB信号是高电平有效。

④FSL总线:快速单工链接接口,提供一种效率高、占用资源少的单向的点对点数据流传输。最新的Microblaze 7.2处理器最多支持16个FSL接口,每个FSL接口有一个输入和一个输出接口组成。FSL总线的读写操作通过Microblaze的PUT和GET指令完成的, 分为两种模式: 阻塞模式和非阻塞模式。阻塞模式是指写操作时如fifo满或读操作时如fifo空时处理器会等待,只到fifo不满而写操作成功或fifo非空而读操作成功。非阻塞模式读写操作不成功时处理器不会等待,但会在MSR中设置进位信号。

⑤XCL总线:Xilinx 缓存链路接口,用在需要使用外部存储时,提供一种高效和延时最小的方案,XCL接口设计为直接通过内嵌的FSL接口连接到内存控制器。

⑥ Debug和Trace:用于基于JTAG的软件调试模块DMD(

Xilinx Microprocessor Debug Module)。

对于代码量不大的应用来说,代码和数据都可以放在BLOCK RAM内而使用LMB总线比较方便,如果需要外扩存储器时,就要使用XCL总线来提供访问外部存储器的效率。外设连接一般用到PLB或OPB或FSL总线。像LMB,FSL总线协议是比较简单的,但使用也是比较多的,具体读写时序可以参考MicroBlaze Processor Reference Guide的第2章信号接口描述,而PLB总线可以参考IBM 128-Bit Processor Local Bus Architectural Specification (v4.6)。在EDK\hw安装目录下的EDKIP核内有相应的IP说明文档参考。

四、系统移植与测试步骤

μC/OS-II的大部分代码是用ANSI C编写的, 设计之初已经充分考虑了可移植性。它的的硬件/软件体系结构(V2.52)如下图示:

移植过程要在硬件上增加一个操作系统定时器和软件上修改下处理器相关的几个文件就可以了。基于Micriμm公司的AN-1013 Application Note,软件版本为EDK 10.1, 硬件平台为赛灵思的Spartan-3E Starter Kit进行了移植与测试,详细步骤如下:

1.把AN-1013\edk_user_repository\Micrium\bsp、uCOS-II_v2_86_a整个文件夹拷贝到EDK 安装目录如C:\Xilinx\10.1\EDK\sw\lib\bsp下,这样我们就可以在OS & Library Settings选择项里选择uCOS-II了。(可以参考第二节内容)

2.把AN-1013\MICRIUM整个文件夹拷贝C盘根目录, 这是Tcl脚本产生操作系统库时默认的路径,如果放在其它目录时,必须在配制OS时的FILE LOCATION指定具体位置,否则会提示很多类似下面的错误:

Unable to find uC/OS-II source file, os_flag.c" "" "libgen_error"

3.用XPS(Xilinx Platform Studio)的BSP构建一个处理器系统,具体选项步骤按顺序为:Select Board选择Xilinx Spartan-3E Starter Board, Board Revision为C。

Select Processor选择microblaze。

Configure microblaze Processor里Local Memory选择16kb, 其它选择默认即可。Configure IO interfaces仅选择RS232_DCE(波特率改为115200,禁止中断),DIP_Switches_4Bit, LEDs_8Bit。

按NEXT在software setup里去掉peripheral selftest前的钩,其它的默认即可。

最后Generate产生处理器系统。

4.在XPS 界面左边的Project Information Area点IP Catalog栏,找到XPS Interrup Controller 和XPS Timer/Counter IP,双击IP名添加到系统。

5.在XPS 界面右边的System Assembly View里点Bus Interfaces栏,点开第4步加入的两个IP,如果没有改名默认为xps_intc_0和xps_timer_0, 使SPLB信号连接到mb_plb,这样这两个IP就通过PLB总线连接到了microblaze处理器。

6.在XPS 界面右边的System Assembly View里点Addresses栏,为xps_intc_0和xps_timer_0,分配1K的地址空间,点击右上角的Generate Addresses按钮选择系统自动分配基址和外设的最高地址。

7.在XPS 界面右边的System Assembly View里点Port栏,再点击xps_timer_0图标前的加号,在Interrupt里选择New connection,把Interrupt端口连接到信号线xps_timer_0_Interrupt 双击xps_timer_0图标,在弹出的IP配置窗口里的Use栏里勾选“Only One Timer is Present”。点OK退出配置窗口。

8.再点击Port栏里microblaze_0图标前的加号,在INTERRUPT里选择New connection,把microblaze的中断信号线连接到microblaze_0_INTERRUPT。

9.再点击Port栏里xps_intc_0图标前的加号,在Irq里选择microblaze_0_INTERRUPT;在Intr里把xps_timer_0_Interrupt加为中断源。

10.在XPS界面选择Hardware → Generate Netlist,调用PlatGen 功能,生成硬件网表。11.在XPS 界面选择Software → Software Platform Settings, 在弹出的Software Platform Settings窗口的点击左边的Software Platform ,在Processor Parameters修改CORE_CLOCK_FREQ_Hz的当前值为50MHz,在OS & Library Settings里OS选择uCOS-II。点击左边的OS and Libraries,在Configuration for OS: uCOS-II v2.86.a里对uCOS-II进行配置,对配置的修改由tcl脚本相应地写到OS_CFG.H文件。具体配置项可以参考Micrium-uCOS-II-V286\Micrium\SOFTWARE\uCOS-II\Doc里的uCOS-II-CfgMan.pdf (μC/OS-II配置手册)。

这里除把MISCELLANEOUS→OS_APP_HOOKS_EN 修改为0,uC_Probe选择为false外

其它取默认值不作修改。

注意移植过程中处理器相关的几个文件的修改在文件夹

MICRIUM\Software\uCOS-II\Ports\MicroBlaze\GNU里已经有了,我们不需要改动,具体的修改内容在AN-1013 Application Note文档第四章有详细介绍,可以结合代码进行研究,另外提供一篇论文供读者朋友参考:

https://www.360docs.net/doc/813808979.html,/article/09-05/72510s.html可以下载。

12.打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\BSP\bsp.h,

修改#define BSP_INTC_TIMER1_ID为

XPAR_XPS_INTC_0_XPS_TIMER_0_INTERRUPT_INTR。

修改#define BSP_TIMER1_ADDR为

XPAR_XPS_TIMER_0_BASEADDR

修改#define BSP_GPIO_ADDR为

XPAR_LEDS_8BIT_BASEADDR

13.在XPS 界面选择Software → Generate Libraries and BSPs. 产生库和BSP包。

14. 在XPS 界面左边的Project Information Area点Applications栏,双击Add Software Application Project...

在弹出窗口填写工程名TEST后点OK,生成TEST工程。

展开TEST工程前的加号,右键单击Sources. 在弹出菜单选择Add Existing Files…,把

C:\Micrium\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\app.c加到工程里。

15.点击TEST工程名,在右键弹出菜单选择Mark to Initialize BRAMs.

再在右键弹出菜单选择Build Project编译工程。

出现下面提示的错误:

./microblaze_0/lib//libxil.a(print.o): In function `print':

/edkgnu/head/mb/build/nt/bld_gcc/gcc/libgloss/microblaze/print.c:25: undefined reference to `outbyte'

collect2: ld returned 1 exit status

make: *** [test/executable.elf] Error 1

即print函数里调用的outbyte函数没有找到,

解决方法是在XPS 界面的Software → Software P latform Settings弹出窗口左边点击OS and Libraries. 在Configuration for OS →BSP?_OPTIONSX下的stdin, stdout选择为RS232_DCE。16.在XPS 界面的Device Configuration → Update Bitstream

出现下面提示的错误:

ERROR:Data2MEM:31 - Out of bounds code segment for ram space in

'implementation\system_bd.bmm'.

Memory space 'microblaze_0.lmb_bram_combined' occupies

[0x00000000:0x00003FFF]

Code segment #4 occupies [0x00000050:0x000041F3]

ERROR:MDT - Data2Mem generated errors during execution

原因是bram空间太小,在XPS 界面右边的System Assembly View里点Addresses栏把dlmb_cntlr和ilmb_cntlr的Size改为32K,重新Hardware → Generate Netlist和Build Project 编译工程一遍就可以了。

17.连接并给Spartan-3E Starter Kit开发板上电,

打开Tera Term,选择相应的串口和115200波特率

在XPS界面选择Device Configuration → Download Bitstream

下载成功后发现LED灯只亮不灭,按AppTaskFirst任务知道应该是按300ms间隔亮灭的,最先是怀疑定时器中断没有进来,经过排查发现中断没有问题,是调用的LED_Toggle(1)程序中读出的GPIO数值一直为0,所以取反后写回去的数值一直为1(LED灯常亮)。

调试发现原因是Xilinx Spartan-3E Starter Board默认的LEDs_8Bit为输出而没有设输入连接,在XPS 界面右边的System Assembly View里点Port栏的LEDs_8Bit图标加号,把GPIO_in 连接到GPIO_d_out信号就可以了,如下图示:

打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\BSP\bsp.c在LED_Toggle函数里的led_status = XGpio_mGetDataReg(BSP_GPIO_ADDR,1);下面加行打印信息:

xil_printf("\n\rled_status: %x", led_status );

打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\app.c在AppTaskFirst 函数里该延时为1s, 如下:OSTimeDlyHMSM(0,0,1,0);

然后在XPS界面选择:

①Hardware → Clean Netlist

②Hardware → Clean Bits

③Hardware → Generate Netlist

④Hardware → Generate Bitstream

⑤Software → Clean Libraries

⑥Software → Generate Libraries and BSPs

⑦点击TEST工程名,在右键弹出菜单选择Clean Project 后在选择Build Project编译工程。

⑧Device Configuration → Update Bitstream

⑨Device Configuration → Download Bitstream

下载成功后可以看到LED灯亮灭,串口同时输出LED的状态,如下图:

至此,系统的移植与测试已经基本完成,待下一步再进行详细地测试与使用。

五、XPS中断控制器的使用

嵌入式应用中往往需要用到多个中断来提高系统响应的及时性,而MICROBLAZE处理器只提供一个中断输入信号来产生一个中断,因此一般基于MICROBLAZE的应用都需要进行外扩中断,XILINX提供的XPS中断控制器IP可以使我们十分方便地进行中断扩展。下面首先简单介绍下XPS中断控制器的特性与寄存器,然后在上一节的基础上结合一个实例来说明它的使用。

1.中断控制器的特性与寄存器(XPS Interrupt Controller,v1.00)

XPS中断控制器采用PLB接口,可以提供多达32个中断输入源、产生一个中断输出信号。每一中断输入源可以单独的使能和不使能,每一中断输入源可以配置为边缘触发中断或电平触发中断。边缘触发中断可配置为上沿触发或下沿触发,电平触发中断可配置为高电平触发或低电平触发。中断的优先级由矢量位置决定,最低位有最高优先级。中断控制器提供八个32位的寄存器用来编程控制(有些寄存器是可选的),分别为:

①中断状态寄存器(ISR:Interrupt Status Register):地址为C_BASEADDR + 0x0,可读写寄存器,读时每一位对应一个中断输入的标志位,当MER的HIE位为0时可写。

②中断挂起寄存器(IPR:Interrupt Pending Register):地址为C_BASEADDR + 0x4,可选的只读寄存器,读出结果为中断标志位与中断使能位的AND。

③中断使能寄存器(IER:Interrupt Enable Register):地址为C_BASEADDR + 0x8,可读写寄存器,每一位对应一个中断输入的使能位。

④中断应答寄存器(IAR:Interrupt Acknowledge Register):地址为C_BASEADDR + 0xC,只写寄存器,每位写1清对应的中断标志位。

⑤设置中断使能寄存器(SIE:Set Interrupt Enables):地址为C_BASEADDR + 0x10,只写寄存器,每位写1设对应的中断使能位。

⑥请除中断使能寄存器(CIE:Clear Interrupt Enables):地址为C_BASEADDR + 0x14,只写寄存器,每位写1清对应的中断使能位。

⑦中断矢量寄存器(IVR:Interrupt Vector Register):地址为C_BASEADDR + 0x18,可选的只读寄存器,读出结果为当前激活的最高优先级中断的中断矢量,无中断时读为全1。

⑧主使能寄存器(MER:Master Enable Register):地址为C_BASEADDR + 0x1C,可读写寄存器,只用到两位,最低位ME使能IRQ,次低位HIE为硬件中断使能。

2.一个实例

上一节我们基于μC/OS-II的延时函数实现了一个LED灯闪烁的实验,本节准备在上一节的基础上实现下面的功能:通过GPIO中断来激活或挂起一个比LED灯闪烁任务更高优先级的任务,以验证中断控制器的使用和任务的抢占,下面是具体步骤:

(1).打开上一节的工程,在XPS 界面右边的System Assembly View里点Port栏,再双击DIP_Switches_4Bit图标,在弹出的IP配置窗口里的Use栏里勾选“GPIO Supports Interrupts”。点OK退出配置窗口。展开DIP_Switches_4Bit图标前的加号,选择IP2INTC_Irpt线为New Connection。

(2). 在XPS界面右边的System Assembly View里点Port栏,展开xps_intc_0图标前的加号,

在Intr里把DIP_Switches_4Bi_IP2INTC_Irpt_0加为中断源,并把优先级设为比xps_timer_0_Interrupt低,点OK退出窗口。

(3) 然后在XPS界面顺序选择:

①Hardware → Clean Netlist

②Hardware → Clean Bits

③Hardware → Generate Netlist

④Hardware → Generate Bitstream

(4) 修改C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\ app.c文件增加一个显示流水灯的任务。具体修改如下:

①. 在main函数前加入如下代码:

INT16U flag1;

OS_STK AppTaskSecondStk [256];

void AppTaskSecond(void *p_arg)

{

INT8U i;

INT32U j;

i=2;

BSP_InitIO();

while (1) {

LED_Off(0);

LED_On(i);

i++;

if(i>4)

{

i=2;

}

for(j=0;j<699999; j++); //Delay1

}

}

②在main 函数里的OSInit();后面加入如下代码:

f lag1 =0;

OSTaskCreateExt(AppT askSecond,

(void *)0,

&AppT askSecondStk[255],

2,

2,

&AppT askSecondStk[0],

256,

(void *)0,

OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

③把AppTaskFirst函数里调用的BSP_InitIO();语句删除,因为我们在更高优先级的AppTaskSecond任务里已经调用过了。

(5) 修改C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\app_cfg.h如下:#define APP_TASK_FIRST_ID 3

#define APP_TASK_FIRST_PRIO 3

#define APP_TASK_FIRST_STK_SIZE 256

即降低第一个任务的优先级和减少堆栈容量。

(6) 修改C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\BSP\bsp.c文件

①.在BSP_InitIntCtrl中断初始化函数前加入GPIO的中断函数如下:

extern INT16U flag1;

void BSP_GpioHandler(void *baseaddr_p)

{

for(gpio_status=0; gpio_status<69999; gpio_status++); //Delay2

if(flag1==0)

{

OSTaskSuspend(2);

flag1=1;

}

else

{

OSTaskResume(2);

flag1=0;

}

XGpio_mWriteReg(XPAR_DIP_SWITCHES_4BIT_BASEADDR, 0x120, 0x1);

}

②在BSP_InitIntCtrl函数内的

init_status = XIntc_Connect(&int_ctl, BSP_INTC_TIMER1_ID,BSP_Timer1Handler,(void *)0);语句下面添加下列语句:

init_status = XIntc_Connect(&int_ctl, XPAR_XPS_INTC_0_DIP_SWITCHES_4BIT_IP2INTC_IRPT_INTR,BSP_GpioHandler,(v oid *)0);

XIntc_Enable(&int_ctl,

XPAR_XPS_INTC_0_DIP_SWITCHES_4BIT_IP2INTC_IRPT_INTR);

XGpio_mWriteReg(XPAR_DIP_SWITCHES_4BIT_BASEADDR, XGPIO_TRI_OFFSET, 0xffffffff);

XGpio_mWriteReg(XPAR_DIP_SWITCHES_4BIT_BASEADDR, XGPIO_GIE_OFFSET, XGPIO_GIE_GINTR_ENABLE_MASK);

XGpio_mWriteReg(XPAR_DIP_SWITCHES_4BIT_BASEADDR, XGPIO_IER_OFFSET, 0x1);

(7) 在XPS界面选择:

①Software → Clean Libraries

②Software → Generate Libraries and BSPs

③点击TEST工程名,在右键弹出菜单选择Set Compiler Options...,

在Debug and Optimization选择No Optimization。

再在右键弹出菜单选择选择Clean Project 后在选择Build Project编译工程。

④Device Configuration → Update Bitstream

⑤Device Configuration → Download Bitstream

下载成功后可以看到系统首先运行高优先级的任务使LED[2:4]跑流水灯,拨下DIP开关产生GPIO中断,进入中断函数内把高优先级任务挂起,则系统运行次优先级的任务使LED1闪烁,在拨下DIP开关,进入中断后恢复高优先级任务,又可以看到LED[2:4]跑流水灯,次优先级任务由于抢占已经不在运行(LED1不再闪烁)。

3.最后总结一下调试中遇到问题:

(1).要用XPS中断控制器进行中断扩展,有三个地方相应的使能位都要打开,否则中断进不来,一个MICROBLAZE的中断使能位,二是中断控制器各个输入的使能位和输出使能位,三是具体中断源的使能位(GPIO的单独位的使能位和总使能位),而硬件上也要确认连接好。

(2).进入中断后要清标志位,包括中断控制器和中断源两个地方的标志位,否则出现中断退出后又立刻进来的现象。

(3). DIP开关由手工拨动,一般有按键反弹现象,所以要延时下消抖,这就是上面代码//Delay2的作用,如果不消抖,可能出现拨一下进入中断多次的现象。

(4) 带了操作系统后,如果任务多点或堆栈大一点,往往不能把全部代码放在BRAM里,这时在Device Configuration → Update Bitstream步骤时会报错说容量不够,所以这里我把堆栈改为256了,实际项目使用的话往往要外扩FLASH和RAM

六、扩展NOR FLASH

赛灵思的Spartan-3E Starter Kit开发板板上载有Intel的16 MByte (128 Mbit) 并行NOR Flash,FLASH的型号为28F128J3,详细地DA TA SHEET网上可以找到来参考。在EDK的硬件上我们使用XILINX的XPS Multi-CHannel External Memory Controller(XPS MCH EMC)接口IP来连接FLASH。如果我们用BSB建立工程的话,选择了Spartan-3E Starter Kit开

发板后在下面的步骤里直接钩选FLASH就可以了,这样比较方便。如果是在已有工程的IP Catalog里添加IP,还必须指定引脚的连接情况和PAD位置,具体的PAD位置参考赛灵思的文档UG230:Spartan-3E FPGA Starter Kit Board User Guide的第11章。在XPS界面左边的Project栏下面的Project file的UCF文件内指定管脚,稍为麻烦一下,推荐由第一种方法直接通过BSB建立工程。具体IP核的使用请参考赛灵思文档:XPS Multi-CHannel External Memory Controller Product Specification.pdf。

赛灵思的Spartan-3E Starter Kit开发板上的XC3S500E FPGA支持BPI(Byte Peripheral Interface)配置模式。要实现BPI方式配置,首先要对Spartan-3E Starter Kit开发板J30进行跳线,具体可以参考赛灵思文档UG230:Spartan-3E FPGA Starter Kit Board User Guide第89页的表11-4。选用BPI UP(BPI DOWN)模式,FPGA配置数据应该放在FLASH的低(高)地址空间,这里注意下28F128J3 FLASH有×8(数据总线宽度为8位,这时数据总线高8位没有用,数据放在总线低8位)和×16(数据总线宽度为16位)两种工作模式。配置时应工作在×8模式,配置完成后,我们把它设置为×16模式,这是通过FLASH的BYTE#引脚选择,BYTE#引脚为低电平时为选择×8工作模式,为高电平时为选择×16工作模式。BYTE#引脚是连接到FPGA的LDC2(C17)脚位。配置比特流文件首先通过iMPCT工具转换成MCS文件,具体步骤为:选择Prepare a PROM File后按NEXT,选择Generic Parallel PROM 和MCS文件格式,指定生成文件的名字和保存位置按NEXT,在按NEXT后进入选择PROM 器件界面,选择PROM大小为16M和Create BPI-Mode PROM后按NEXT选择要转换的BIT 文件就可以了。然后我们可以通过赛灵思的PicoBlaze NOR Flash Programmer (https://www.360docs.net/doc/813808979.html,/products/boards/s3estarter/files/s3esk_picoblaze_nor_flash_programmer .zip)下载到FLASH中,当然我们也可以自己用MicroBlaze处理器编写一个烧写FLASH的工程来下载MCS文件到FLASH,但都不如直接使用来的方便,有兴趣的朋友也可以研究或修改PicoBlaze NOR Flash Programmer工程,里面有PicoBlaze的汇编源程序。

介绍下MicroBlaze工程编译后的目标代码段的组成:

.text: 存放指令代码。

.rodata: 存放只读的变量。

.data:存放带初始值的全局与静态变量

.sdata::存放小的带初始值的全局与静态变量

.sdata2: 存放小的带初始值的全局与静态变量

.bss: 存放无初始值的全局与静态变量

.sbss: 存放小的无初始值的全局与静态变量

.sbss2: 存放小的带初始值的全局与静态变量

我们准备在NOR FLASH上面直接执行程序,所以要把只读的段(包括.text、.rodata、.sdata2、.sbss2)定义到FLASH地址空间,把其它的段都定义到FPGA片内的BRAM。

下面以一个实际例子来介绍具体步骤:

1.首先按上节的步骤建立一个XPS工程和应用程序,在BSP阶段的外设选择时把FLASH 加上,这时系统自动添加了XPS MCH EMC接口IP。

2.我们先把所有段还是放在BRAM内,编译下载后可以看到LED在跑流水灯。

3.配置XPS MCH EMC接口IP用PLB连接到MicroBlaze处理器,无MCH通道,其它为默认。

4.点击XPS界面左边的工程名,在右键弹出菜单里选择Generate Linker Script,在弹出对话框中可以选择段的存放空间,把只读的段.text、.rodata、.sdata2、.sbss2选择到FLASH_C_MEM0_BASEADDR, 其它段选择到ilmb_cntlr_dlmb_ cntlr,然后重新编译工程,

产生可执行的链接文件(ELF文件)。

5.把第4步生成的executable.elf拷到工程目录,然后在XPS界面选择Projec t → Launch EDK Shell,在命令行输入下面命令:

mb-objcopy \

--set-section-flags .text=alloc,readonly,code \

--set-section-flags .init=alloc,readonly,code \

--set-section-flags .fini=alloc,readonly,code \

--set-section-flags .text=alloc,readonly,code \

--set-section-flags .rodata=alloc \

--set-section-flags .sdata=contents \

--set-section-flags .sbbs=contents executable.elf volatile.elf

这可以把在BRAM中的内容存储volatile.elf文件。

再在命令行输入下面命令:

mb-objcopy –O binary -j .text –j .fini –j .init –j rodata –j sdata2 –j .sbss2 executable.elf flash.bin

这可以把在FLASH中的内容存储flash.bin文件。

6.把flash.bin文件烧到FLASH中,这可以通过上面的PicoBlaze NOR Flash Programmer工程用串口下载,也可以用XPS界面选择Device Configuration → Program Flash Memory下载, 注意不用XPS生成BootLoad。

7.把第五步生成的volatile.elf改名为executable.elf覆盖第4步生成的executable.elf文件。然后用XPS界面选择Device Configuration → Updata Bitstream和Device Configuration → Download Bitstream把BRAM中的内容与FPGA配置数据下载到FPGA。

现在又可以看到LED在跑流水灯了,但明显可以看到速度要慢多了,说明程序是在NOR FLASH上执行的。如果速度要求不高的话,扩展一块NOR FLASH来存储代码与数据已经足够了,否则我们需要再扩展一块RAM,把代码与数据存储在RAM上速度比较快,同时需要一个BOOTLAOD工程用作上电时实现把代码与数据从FLASH上搬移到RAM的功能。最后提一下,如果BRAM的内容与FPGA配置数据要存储到FLASH上供上电时用BPI方式下载,要注意存储配置数据的地址空间和应用程序的地址空间不能重叠,一个简单的方法是选用BPI DOWN模式,把配置数据放在FLASH最后面的空间,当然我们也可以用分页的方法解决。

实操性最强:uCOS-II移植到STM32上的详细步骤;

前言: 说点废话,网上有很多关于uCOS-ii移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,真想问他们,你确定你分析的这些东西是需要你做的工作吗?实操性严重欠缺。。。这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。 首先,简单总结一下移植的大概过程: (1)去uC/OS-ii官网下载你要移植芯片CPU的相关案例,不一定完全对应,那就找相应系列吧。 (2)编程环境一般有两种,分别是IAR和MDK,这个根据你自己的编程环境进行下载。 (3)本案例需要将uC/OS-II 移植到STM32F103ZET6上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于 IAR的,所以要基于IAR的案例进行更改。 (4)使用MDK创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假 如无操作系统时,都有错误,移植过程中也肯定会有编译 错误,那么在排查错误的时候也就增加了难度,不会写物 操作系统的简单程序怎么办。。。那就不要往下看了。 (5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler和 SysTick_Handler的修改。这里我要吐槽一下,网上说了

一大堆关于什么OS_CPU.H的更改还有各种函数的的分析, 这都是扯淡。。。这些根本就不用移植者去修改,官网提供 的案例都已经提供了,除非你选择移植的CPU是比较偏的, 那么这些东西需要移植者自己去编写。 好了,下面就开始详细的记录怎么去移植。 一、创建一个无操作系统的简单裸板系统 1.创建源文件工程文件夹,如下图所示: 其中文件夹“CMSIS”为内核的接口,包含的文件如下 图 文件夹STM32_StdPeriph为固件驱动文件夹,这个把 STM32的固件全都添加进去即可。 文件夹User为其他文件,如下图所示:

基于ARM9的UCOS-II移植

编号: 嵌入式系统设计与制作(论文)说明书 题目:基于嵌入式ARM的 μC/OS-II移植 院(系):信息与通信学院 专业:电子信息工程 学生姓名: 学号: 指导教师: 2012年12月29日

嵌入式系统设计与制作实训任务书

以应用为中心、以计算机为基础的嵌入式技术,是当今发展最快、应用最广、最有发展前景的主要技术之一。嵌入式技术已经被广泛应用于工业控制、移动通信、信息家电、医疗仪器、汽车电子、航空航天等各个领域。 在各种嵌入式处理器中,ARM以体积小、低功耗、低成本、高性能等优点,获得许多半导体厂商的支持,在嵌入式应用领域取得巨大的成功。软件方面,uC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,因而被使用频繁。 本文主要研究了μC/OS-II在S3c2440芯片上的移植。本文通过对S3c2440硬件和源码公开的嵌入式实时操作系统μC/OS-II的分析,以S3C2440为例,阐述了在ARM9上移植μC/OS-II,来运行多个任务,用液晶显示来说明μC/OS-II移植的优缺点,以及在移植中应注意的问题,启动代码的理解,解析代码的优化。 关键词:嵌入式系统;实时;ARM9;μC/OS-II

Application, embedded computer-based technology, is one of today's fastest-growing, most widely used, the most promising technologies. Embedded technology has been widely used in industrial control, mobile communications, information appliances, medical equipment, automotive electronics, aerospace and other fields. In a variety of embedded processors, ARM advantages of small size, low-power, low-cost, high-performance, get the support of many semiconductor manufacturers, achieved great success in the field of embedded applications. Software, u C / OS is a free, open-source, compact structure, can be deprived of a real-time operating system for real-time kernel, thus frequent. This paper studies the μC / OS-II in the S3c2440 chip transplant. This article by S3c2440 hardware and open source embedded real-time operating system μC / OS-II analysis, for example, descr ibed to S3C2440 ARM9 on transplantation μC / OS-II to run multiple tasks to illustrate with LCD transplant μC / OS-II strengths and weaknesses, as well as the transplant should pay attention to the problem of understanding of the startup code, the parsing code optimization. Key words: embedded system; real-time; ARM9; μC / OS-II

UCOSII移植过程及心得

UCOSII V2.86在LPC2378上的移植 (编译器ADS1.2) 忙了几天,终于移植成功了。 移植UCOS需要准备一些东西,首先当然是OS源代码,再就是选定编译器,需要弄清一下几点: 1、UCOS需要移植的内容 2、编译器的特性(在这里主要是ATPCS) 3、处理器的特性(这里主要注意ARM7的模式) 以下先简要说一下这几点,为后面的程序说明做准备 首先说说第一点,UCOS需要移植的内容。 1、数据类型的定义,这个根据平台来处理。具体代码如下: 2、任务切换函数,就是两个任务环境之间的切换。 3、处理临界代码前要关闭中断,之后再打开,这个实现的方法与平台关系很大。 4、栈的初始化,栈中保存的是任务的运行环境,不同的处理器中的寄存器自然是不一样的。 5、还有一个和任务切换差不多的,这个函数只运行一次,就是将第一个运行的任务的运行环境复制到CPU中。 再说说编译器的特性,ATPCS规定(想要详细一些的可以看看ADS 的帮助文档):R0-R3用来传递参数,R4-R12用来处理局部变量。这个在处理汇编和C的接口时十分重要。 最后是CPU的特性。ARM7有7种模式,但是有些模式对于UCOS在ARM7上的运行用处不大,经过综合考虑,可以只使用四种模式:SVC:运行OS代码和用户代码 SYS:用于IRQ的嵌套处理,(暂时还未实现) IRQ:处理中断,处于OS的控制范围内 FIQ:独立于操作系统,处理快速中断 有了上面的说明,下面可以具体讨论了,因为网页中显示代码及注释不方便,所以把它们放在了附件中。 标题中前面是内容,括号内是涉及到的需要移植的函数 1、任务栈(OSTaskStkInit)

UcOS2移植

学号: 嵌入式系统及应用 实验报告 uc/os-II的移植 学生姓名 班级 成绩 计算机与信息工程学院 2013年10月14日

任务的基本管理 1、实验目的 a)理解stm32处理器的寄存器结构; b)写好uc/os-II的接口代码; 2、实验原理及程序结构 2.1 实验设计 本实验主要实现操作和底层寄存器的数据交换和通信,从而实现操作系统的移植。实现主要如下。 (1)实现配置文件的编写; (2)实现寄存器和内存的管理; 2.2 源程序说明 IMPORT OSRunning ; External references IMPORT OSPrioCur IMPORT OSPrioHighRdy IMPORT OSTCBCur IMPORT OSTCBHighRdy IMPORT OSIntNesting IMPORT OSIntExit IMPORT OSTaskSwHook EXPORT OSStartHighRdy EXPORT OSCtxSw EXPORT OSIntCtxSw EXPORT OS_CPU_SR_Save ; Functions declared in this file EXPORT OS_CPU_SR_Restore EXPORT PendSV_Handler

NVIC_INT_CTRL EQU 0xE000ED04 ; 中断控制寄存器 NVIC_SYSPRI2 EQU 0xE000ED20 ; 系统优先级寄存器(2) NVIC_PENDSV_PRI EQU 0xFFFF0000 ; PendSV中断和系统节拍中断 ; (都为最低,0xff). NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值. PRESERVE8 AREA |.text|, CODE, READONLY THUMB OS_CPU_SR_Save MRS R0, PRIMASK ;读取PRIMASK到R0,R0为返回值 CPSID I ;PRIMASK=1,关中断(NMI和硬件FAULT可以响应) BX LR ;返回 OS_CPU_SR_Restore MSR PRIMASK, R0 ;读取R0到PRIMASK中,R0为参数 BX LR ;返回 ;函数名称: OSStartHighRdy ;功能描述: 使用调度器运行第一个任务 参数: None 返回值: None OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception priority LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] MOV R4, #0 ; set the PSP to 0 for initial context switch call MSR PSP, R4

在PROTEUS中使用ARM处理器及UCOS-II移植理解

嵌入式系统课程论文 在PROTEUS中使用ARM处理器及uC/OS-II移植理解 Rein Lee 一.嵌入式系统概述 通过本次嵌入式系统课程的学习,我了解了嵌入式系统的概念。所谓嵌入式系统,是指用于执行独立功能的专用计算机系统,它由包括微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,和嵌入在存储器中的微型操作系统、控制应用软件组成,共同实时诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。嵌入式系统以应用为中心,以微电子技术、控制技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件与硬件可裁减,以满足系统对功能、成本、体积和功耗等要求。 1.1 嵌入式系统的硬件特征 嵌入式系统的硬件必须根据具体的应用任务,以功耗、成本、体积、可靠性、处理能力等为指标来选择。嵌入式系统的核心是系统软件和应用软件。由于存储空间有限,因而要求软件代码紧凑、可靠,大多对实时性有严格的要求。 早期的嵌入式系统设计方法,通常是采用“硬件优先”原则。在粗略估计软件任务需求的情况下,首先进行硬件设计与实现。然后在此硬件平台上,再进行软件设计。因为很难充分利用硬件软件资源,取得最佳性能的效果。同时,一旦在测试时发现问题,需求对设计进行修改时,整个设计流程将重新进行,对成本和设计周期的影响很大。这种传统的设计方法只能改善硬件/软件各自的性能,在有限的设计空间不可能对系统做出较好的性能综合优化,在很大程度上依赖于设计者的经验和反复实验。 随着电子系统功能的日益强大和微型化,系统设计涉及的问题越来越多,难度也越来越大。硬件和软件也不再是截然分开的两个概念。因而出现了软硬件协同的设计方法。在系统目标要求下,协同设计软硬件体系结构,以最大限度地挖掘系统软硬件能力,得到高性能低代价的优化设计方案。 1.2 嵌入式操作系统 目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式系统,如微软公司的Windows CE,SUN公司的Java操作系统,嵌入式Linux等。 另一类是实时操作系统,如WindRiver公司的VxWorks,ISI的pSOS,ATI的Nucleus,和免费公开源代码的uC/OS-II等。 二.在Proteus中使用ARM处理器 由于Proteus中只支持LPC系列的ARM处理器,在这里只是简单的列举出LPC2124的一些特性: LPC2124是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU的微处理器,并带有256k 的嵌入的高速Flash存储器和16k的片那静态RAM。128位宽度的存储器接口和独特的加速结构使得32位代码能够在最大的时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式,将使得代码规模降低超过30%,而性能的损失却很小。 LPC2124片那Boot装载程序实现在系统编程(ISP)和在应用编程(IAP)。1ms可以编程512字节。整片擦除只需要400ms。此外还有4路A/D转换器,转换时间低于2.24us;2个32位定时器,6路PWM输出、RTC、看门狗和多个串 第 1 页共 7 页

UCOS-II ucGUI的完美移植

stm32 UCGUI 完美移植 作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment 前一篇:stm32 DA 数模转换 后一篇:Stm32 SWD 下载 调试配置 UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。 它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。 类似程序还有国产的一个MINIGUI (https://www.360docs.net/doc/813808979.html,/zhcn/),MiniGUI 是一个自由软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。有机会尝试下,支持下国产,毕竟国内这样的公司不多。。 这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。 UCGUI390a 下载 整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。。。总之移植是个累人的活 首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章 UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。。。 相关文件介绍如下:

Nexys3移植uCOS-II实验报告

Nexys3移植uCOS-II实验报告 实验成员及时间 姚灿荣、贺文强、方圆 2013年2月28日 实验准备 (1)书籍《嵌入式操作系统原理及应用》(严海蓉著) (2)计算机(电脑)、Nexys?3 Spartan-6 FPGA Board、开发板随带的USB连接线; (3)Micrium公司的μCOS-II和Xilinx MicroBlaze Processor Application Note; (4)Micrium公司的Micrium-uCOS-II-V290.zip,包括代码与文档; (5)Xilinx公司EDK开发套件,版本号为EDK 12.4; (6)Digilent公司生产的Nexys3开发板对EDK12.4的plugin文件。 (1)、(2)、(4)的文件都可以在随书光盘上的实验指导部分找到。

实验过程 (1)安装EDK 12.4; (2)使用USB线连接开发板与计算机,打开开发板电源; (3)按照《嵌入式操作系统原理及应用》书后实验一进行软硬件配置; 一.在开发环境加入NEXY3 的板级支持包,以便开发套件对开发板的识别1.把AN-1013\edk_user_repository\Micrium\bsp、uCOS-II_v2_90_a整个文件夹复制到EDK安装目录,如D:\Xilinx\12.4\EDK\sw\lib\bsp下,这样我们就可以在OS & Library Settings选项中选择μCOS-II了。 2.plugin文件中的Digilent文件夹复制到ISE的安装目录下,如D:\Xilinx12_4\ISE_DS\ISE\lib\nt\plugins,以保证最后文件从SDK中下载到开发板时可以正确识别并连接。 二.操作系统硬件环境构建: 分步创建过程执行结果如下: 处理器构建: 1.Bus Interfaces配置结果

51单片机上移植ucos-II

嵌入式实时操作系统实验报告
51 单片机上移植μC/ OS-II


计算机与电子系 电子 0901 班 高傲 黄向宇
专业班级 学生姓名 指导教师
提交日期 2012 年 4 月 17 日

一、 实验目的
理解移植μC/OS-II的一般原理及基本方法。 掌握在51单片机上移植μC/ OS-II的方法及步骤,掌握在51单片机上基于μC/ OS-II系统构建应用程序的基本原理及方法。
二、实验内容
1.建立并熟悉编译及仿真调试环境(keil + proteus)。 2.下载已移植好的软件包,在开发环境下建立工程编译并运行观察运行结 果,使用Keil自带的仿真调试工具观察程序运行情况(内存的分配、变量及CPU 寄存器的动态变化、 任务的切换运行状态等) 比较移植前和移植后的相关文件, ; 分析移植过程中做了哪些改动工作。 3.结合前两次实验内容,在移植软件包的基础上尝试增加用户任务,并利用 信号量、消息邮箱等建立任务之间的通信联系;同时尝试采用动态内存分配的方 法为任务分配内存,使用Keil仿真工具观察程序运行情况并记录运行结果。 4.输入课本P220的例子程序,编译运行并观察运行结果。 5. 将以上调试好的软件移植到proteus开发环境中去,利用proteus的硬件 仿真环境创建几个实际任务(如键盘、显示器、LED点阵、数码管、时钟或温度 传感器等)给每个赋以适当的优先级,配置合适的堆栈容量,编译运行并观察运 行情况,显示信息可以用液晶显示器或虚拟终端来显示。
三.实验原理
1. 移植的概念 所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了 方便移植,大部分的μC/OS-Ⅱ代码是用C语言写的;但仍需要用C和汇编语言写一 些与处理器相关的代码, 这是因为μC/OS-Ⅱ在读写处理器寄存器时只能通过汇编 语言来实现。由于μC/OS-Ⅱ在设计时就已经充分考虑了可移植性,所以μC/OSⅡ的移植相对来说是比较容易的。 要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求: 1. 处理器的C编译器能产生可重入代码。 2. 用C语言就可以打开和关闭中断。

ucos_ii移植过程详解_移植原理

uCOS-II移值过程实例讲解 我将uCOS-II 移植到了EPONS 的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。 首先介绍uCOS-II的文件,如下表: ucos_ii.h os_cfg.h os_cpu.h os_core.c os_dbg_r.c os_flag.c os_mbox.c os_mem.c os_mutex.c os_q.c os_sem.c os_task.c os_time.c ucos_ii.c os_cpu_c.c os_cpu_a.asm 其中我们和硬件平台相关的文件的文件名被加粗了,也就是说若要将uCOS-II移植到新的平台上只要关心以上四个文件就行了。当然你也可以根据需要再添加你自己的和平台相关的文件,事实上我也是这么做的。在我移植的例子中就添加了四个和平台相关的文件,文件如下表: crt0.c drv_rtc.c vector.c ext.s crt0.c是用来初始化系统的比如说MCU的一些特殊寄存器、设置外围的总线接口,等。drv_rtc.c是用来初始化系统中的一个RTC的,这个RTC可以为内核提供必要的基于时间片调度的时基。同时提供了对RTC开始和停止的操作函数。在我的例子中RTC会每秒产生32次中断。vector.c顾名思义,它是系统上电后为系统提供矢量入口表的文件,当然也包括中断向量表。ext.s是为uc/OS-II 提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数的具体实现以及在用户程序的中断函数出入时要调用的状态保护和状态恢复函数OS_SA VEALL ()和OS_RESTOREALL ()。前面两个函数的功能是:OS_ENTER_CRITICAL()屏蔽中断;OS_EXIT_CRITICAL()恢复原来的中断使能状态。 1. os_cpu_a.asm的说明 要想顺利的移植首先要了解uCOS-II的一些基本概念。 uCOS-II实质上是一个嵌入式操作系统内核,她只负责管理各个任务,为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。这是个很重要的概念,可以说你只要掌握了任务切换的本质,可以说你就

uCOS-II移植总结

u C/OS-II移植总结 RTOS移植牵涉到软件平台—编译器、硬件平台—CPU,移植前需要了解CPU及编译器的一些基本特点。 1、编译器 a、堆栈运行原理 本次移植的软件平台为CodeVision编译器,它的堆栈由两部分组成:硬件堆栈 (HardStack)用来保存中断及函数调用的返回地址,它的大小将影响函数调用嵌 套的深度,实际大小应根据中断及函数嵌套的深度来决定,并留有一定的裕度。 硬件堆栈由CPU中的指针SP实现。软件堆栈(SoftStack)用来分配局部变量及 传递参数。在此次移植中,由CPU中的Y指针模拟实现。 b、堆栈指针所指向的单元是否为可用单元 大多数编译器生成的代码,其堆栈指针所指向的单元为可用单元,也就是说在将 数据压入堆栈前不用再调整堆栈指针,堆栈指针在上一次使用完后已经调整好了。 前面所说的硬件堆栈(HardStack)即为这种类型。还有一种堆栈,其指针所指向 的单元为不可用单元,在向堆栈压入数据前需调整堆栈指针,软件堆栈(SoftStack) 即为这种类型。 软件堆栈设计为这种形式完全是为了适应A VR指令和软件堆栈增长方向与硬件 堆栈增长方向相同。软件堆栈(SoftStack)由Y指针模拟实现,但在A VR的指令 集中只有: LD Rd,Y+ LD Rd,–Y ST Y+,Rr ST –Y,Rr 要实现向下增长的堆栈就只能使用ST –Y,Rr和LD Rd,Y+。指针指向的单元 已压入数据,因此使用前需调整指针,而ST –Y,Rr正好能完成这个动作。 c、多字节变量在宽度为单字节的存储器中的分配规则 多字节变量指定义为int、long int、float、double等类型的变量。 在CodeVision编译器遵循的原则是:变量低字节部分分配在内存的低地址单元, 变量高字节部分分配在内存高地址单元。 如:int a a为双字节变量,其低字节保存在内存的0x24H,则高字节保存在内 存的0x25H。 了解这些变量在内存中存储形式是为了能够在在线汇编中正确操作它们。 2、CPU a、程序计数器PC压入堆栈中的形式 中断或函数调用时,首先压入硬件堆栈的是程序计数器的低字节PCL接着再将程 序计数器的高字节PCH压入。在任务堆栈初始化函数 OSTaskStkInit()中需要对硬件堆栈和软件堆栈初始化。对硬件堆栈初始化就是 模拟中断时CPU保存PC的过程,因此将传递过来的任务起始地址的低字节放在 硬件堆栈的栈底,高字节放在硬件堆栈的下一单元。这两个字节存放的正确与否 将决定整个系统能否正常工作。 此外我感觉u C/OS-II中的全局变量定义顺序不是太好,事件控制块ECB的定义插在全局变量定义中间(可以查看.map文件)。如果没有定义事件控制块ECB,重要的全局变量基本上分配在寄存器中(CodeVision中bit 变量数设为0),但定义事件控制块ECB后全局变量将有可能移动到RAM区。在MEGA单片机中对寄存器操作和对RAM区操作的指令是不一样的,因此在编写OS_CPU_A.C中的汇编函数时,由于ECB定义是否插入将改变操作全局变量的指令。在OS_CFG.H改变ECB的配置将影响以前已经写好的接口文件,为了消除这种影响可将需要汇编操作的全局变量放到前面定义。 E_Mail:gnaijnaoul@https://www.360docs.net/doc/813808979.html,

UCOS_II在PC上的移植(详细版)

UCOS II在PC上的移植 网上移植教程有不少,不过对于初学者还是容易出问题,在这里将移植的详细过程记录如下,建议有兴趣的同学,找台电脑,从头试一遍,这样就算是入门了. 一、准备工作 在PC上移植ucos系统,因为ucos系统的源代码是c语言写的,因此编译C的软件必不可少。在pc机上运行,还需要对pc的设备进行一空的控制,会用到汇编语言,因此汇编语言的编译软件也必不可少。再有就是操作系统的源码,这些都准备好了,就可以进行移植了。 一些教材在移植是c编译环境选BORLAND C++ 4.5,汇编编译用TASM5.0,网络上能找到的移植方法基本都是基于这2个软件的。这2个编译软件和操作系统源码可以通过网络下载。 图1 ucos移植的必备文件 下载解压后,如图1所示。下边开始安装,编译软件。BORLAND C++和TASM5.0安装顺序不会影响到使用,在安装之前先来看下c盘的文件结构。在图2中,c盘根目录下只有3个文件夹,当我们配置完成后,会多出4个文件夹。 图2 编译环境安装前c盘文件结构 二、开始安装 1.安装编译软件BORLAND C++ 4.5。

在BORLAND C++ 4.5安装文件包里找到找到install.exe文件并双击,默认的安装路径就C:\BC45。因此安装时,可以用默认设置一直继续,安装过程如图3所示(注意安装包里还有一个setup文件,请不要用它来安装)。 图3 bc4.5安装界面 2.安装汇编编译软件TASM5.0 (1)这一步如果不小心,很容易安装不正确。先在C盘建立一个名为TASM的文件夹,然后把TASM5.0安装文件里的所有文件都复制进去。如图4所示,双击图4中的install 文件开始安装。 图4 TASM5.0安装 (2)在弹出的界面按回车键继续,出现安装选择文件界面,将默认的A改为C如图5所示。

ucosii移植实验报告

一、实验目的 ●了解uC/OS-II内核的主要结构。 ●掌握将uC/OS-II内核移植到Cortex-M3处理器上的基本方法。 二、实验环境与设备 ●硬件:Cortex-M3嵌入式开发平台、用于Cortex-M3的JTAG仿真器或 者内嵌的JTAG仿真器、PC机Pentium100以上。 ●软件:PC机操作系统win98、Win2000或WinXP、Keil for ARM或IAR for ARM集成开发环境、仿真器驱动程序、超级终端通讯程序等。 三、预备知识 ●掌握在Keil for ARM或IAR for ARM集成开发环境中编写和调试程序的 基本过程。 ●了解Cortex-M3处理器的结构。 ●理解uC/OS-II系统结构。 四、实验内容 ●将uC/OS-II内核移植到Cortex-M3微处理器上。 ●编写两个简单任务,在超级终端上观察两个任务的切换。 五、流程图 六、实验代码 修改后的Os_cpu.h #ifndef OS_CPU_H #define OS_CPU_H

#ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif typedef unsigned char BOOLEAN; typedef unsigned char INT8U; /* Unsigned 8 bit quantity*/ typedef signed char INT8S; /* Signed 8 bit quantity */ typedef unsigned short INT16U; /* Unsigned 16 bit quantity*/ typedef signed short INT16S; /* Signed 16 bit quantity */ typedef unsigned int INT32U; /* Unsigned 32 bit quantity */ typedef signed int INT32S; /* Signed 32 bit quantity */ typedef float FP32; /* Single precision floating point*/ typedef double FP64; /* Double precision floating point */ typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */ typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */ #define OS_CRITICAL_METHOD 3u #if OS_CRITICAL_METHOD == 3u #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} #endif #define OS_STK_GROWTH 1u /* Stack grows from HIGH to LOW memory on ARM */ #define OS_TASK_SW() OSCtxSw() #if OS_CRITICAL_METHOD == 3u /* See OS_CPU_A.ASM */ OS_CPU_SR OS_CPU_SR_Save(void); void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr); #endif void OSCtxSw(void); void OSIntCtxSw(void); void OSStartHighRdy(void); void OSPendSV(void); #endif

实验二-UCOS-II任务管理

班级学号姓名同组人 实验日期室温大气压成绩 实验二 UCOS-II任务管理 一、实验目的 1、掌握UCOS-II中任务管理的函数的应用。 2、掌握UCOS-II在STM32平台下对硬件的控制。 3、掌握开发UCOS-II应用的程序结构。 二、实验步骤 1、UCOSII工作原理 UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。 UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。 中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。 UCOSII任务的5个状态转换关系如图所示: 与任务相关的几个函数: 1)建立任务函数 UCOSII提供了我们2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat函数来创建任务,该函数原型为: OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)

ucosII嵌入式实时操作系统实验

嵌入式实时操作系统实验报告 多任务的创建及运行 系别计算机与电子系 专业班级电子0901班 学生姓名高傲 指导教师黄向宇 提交日期 2012 年 4 月 1 日

一、实验目的 1.熟悉并掌握基于uC/OS-II的开发工具、工程管理工具 2.了解uC/OS-II的文件结构、文件之间的依赖关系。 3.掌握创建多任务的方法及对任务进行相关操作的技巧。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境 2.使用课本配套光盘中的例程运行并修改,观察多任务的运行状态,尝试对其中的任务进行挂起并恢复、删除及查询等操作,观察运行结果. 3.完成课后练习题,P92页13-17题,至少完成其中任意两题。 三、实验原理 1.编译环境 Turbo C是Borland公司开发的DOS下16位C语言集成开发工具。有2.0和3.0版本,2.0只支持C语言编译不支持鼠标操作,而3.0版本可以支持C/C++两种语言编译,而且还支持鼠标和//注释方式;TC2.0是80年代开发的,使用了很多年一直到现在WINDOWS系统才逐渐退出舞台。Turbo C2.0不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要

后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux 下GNU的make。 ?Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。 ?而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。 ?makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。 2. uC/OS-II 文件体系 uC/OS-II 包括三个部分: 1)核心代码部分,这部分代码与处理器无关,包括七个源代码文件和一个头文件,这七个源代码文件负责的功能分别是内核管理、事件管理、消息队列管理、存储管理、消息管理、信号量处理、任务调度和定时管理。2)设置代码部分,包括两个头文件,用来配置事件控制块的数目以及是否包含消息管理相关代码等。 3)处理器相关的移植代码部分,这部分包括一个头文件,一个汇编文件和一个C 代码文件,在uC/OS-II 的移植过程中,用户所需要关注的就是这部分文件。 3. uC/OS-II 任务的创建,OSTaskCreate() 想让μC/OS-Ⅱ管理用户的任务,用户必须要先建立任务。用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() 或OSTaskCreateExt()。OSTaskCreate()与μC/OS是向下兼容的,OSTaskCreateExt()是OSTaskCreate()的扩展版本,提供了一些附加的功能。用两个函数中的任何一个都可以建立任务。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至

51单片机上移植ucos-II

嵌入式实时操作系统实验报告 51单片机上移植μC/ OS-II 系别计算机与电子系 专业班级电子0901班 学生姓名高傲 指导教师黄向宇 提交日期2012 年4 月17 日

一、实验目的 理解移植μC/OS-II的一般原理及基本方法。 掌握在51单片机上移植μC/ OS-II的方法及步骤,掌握在51单片机上基于μC/ OS-II系统构建应用程序的基本原理及方法。 二、实验内容 1.建立并熟悉编译及仿真调试环境(keil + proteus)。 2.下载已移植好的软件包,在开发环境下建立工程编译并运行观察运行结果,使用Keil自带的仿真调试工具观察程序运行情况(内存的分配、变量及CPU 寄存器的动态变化、任务的切换运行状态等);比较移植前和移植后的相关文件,分析移植过程中做了哪些改动工作。 3.结合前两次实验内容,在移植软件包的基础上尝试增加用户任务,并利用信号量、消息邮箱等建立任务之间的通信联系;同时尝试采用动态内存分配的方法为任务分配内存,使用Keil仿真工具观察程序运行情况并记录运行结果。 4.输入课本P220的例子程序,编译运行并观察运行结果。

5. 将以上调试好的软件移植到proteus开发环境中去,利用proteus的硬件仿真环境创建几个实际任务(如键盘、显示器、LED点阵、数码管、时钟或温度传感器等)给每个赋以适当的优先级,配置合适的堆栈容量,编译运行并观察运行情况,显示信息可以用液晶显示器或虚拟终端来显示。 三.实验原理 1. 移植的概念 所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了方便移植,大部分的μC/OS-Ⅱ代码是用C语言写的;但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为μC/OS-Ⅱ在读写处理器寄存器时只能通过汇编语言来实现。由于μC/OS-Ⅱ在设计时就已经充分考虑了可移植性,所以μC/OS-Ⅱ的移植相对来说是比较容易的。 要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求: 1. 处理器的C编译器能产生可重入代码。 2. 用C语言就可以打开和关闭中断。 3. 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。 4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。 5. 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。 如果用户理解了处理器和C编译器的技术细节,移植μC/OS-Ⅱ的工作实际上是非常简单的。前提是您的处理器和编译器满足了μC/OS-Ⅱ的要求,并且已经有了必要工具。移植工作包括以下几个内容: 用#define设置一个常量的值(OS_CPU.H)

详细的S3C2440的ucOSII和ucGUI移植过程

基于S3C2440的uc/OS-II和uc-GUI移植和应用 实验目的: 1.熟悉ARM体系结构 2.深入学习操作系统原理 3.增强动手实践能力 实验平台: ARM9体系结构处理器—S3C2440 飞凌嵌入式开发板—FL2440(由于本实验大部分在宿舍完成,故采用了自己的嵌入式开发板作为平台,硬件与实验箱基本相似) 功能实现 主要功能是利用uc/OS-II的多任务调度功能和uc-GUI提供的图形函数接口,编写一 个Uart传输测试程序。 通过Uart协议,传输PC机键盘输入的数据,在开发板的LCD上显示出来。同时实现了字符串移动和现实系统信息的附加功能。 注:本实验中,移植代码部分参考了网络上的一些相关文章,应用程序部分全部由自己编写完成。 实验原理: 1.背景介绍 (1) ARM9(S3C2440) ARM9系列处理器是英国ARM公司设计的主流嵌入式处理器。S3C2440是三星公司生产的基于ARM9体系结构的处理器,能够运行linux、wince等大型操作系统,构成非常典型的cpu+os嵌入式系统。[1] (2) uc/OS-II uc/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。 uc/OS-II是一个实时操作系统内核,它包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。是一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 (3) uc-GUI uC/GUI是Micrium公司开发的通用的嵌入式用户图形界面软件。它给任何使用图形LCD的应用程序提供独立于处理器和LCD控制器之外的有效的图形用户接口。可以应用于单一任务环境,也可以应用于多任务环境中。uC/GUI能够应用于任何LCD控制器和CPU 的任何尺寸的物理显示或者模拟显示中。

相关主题
相关文档
最新文档