KEIL MDK平台 S3C2440 UCOS-II的移植

KEIL MDK平台 S3C2440 UCOS-II的移植

本系列博文将从软件仿真开始一步步介绍KEIL MDK平台 S3C2440汇编/c语言程序的编辑、编译、链接、调试过程,以及建立裸机程序、移植ucos操作系统、移植ucGUI的全过程。
本帖将介绍基于KEIL MDK平台 S3C2440 uCOS-II移植的上机过程。硬件平台是友善之臂公司出品的micro2440核心板及底板套件。本文将介绍如何将S3C2440的ADS平台UCOS-II例程移植到MDK平台。

准备工作

1.首先准备一个可以在MDK平台下编译烧写的S3C2440裸机程序,可以参考上以章节https://blog.csdn.net/weixin_41551104/article/details/109897264。
2.其次准备一个ADS平台下的S3C2440 UCOS-II程序,可以在友善之臂的官网找到。
3.将ADS工程目录下的UCOS-II源码文件夹移动到MDK工程目录下。

移植

1.在MDK的工程中添加如下文件及目录
在这里插入图片描述

2.添加c语言包含文件夹。
在这里插入图片描述

3.添加汇编语言文件夹
在这里插入图片描述
4.UCOS-II移植中有两个关键点,一个是UCOS-II需要一个系统中断来进行上下文的切换,即任务调度。因此我们需要将IRQ中断交给UCOS-II处理,下列代码将OS_CPU_IRQ_ISR地址装入HandleIRQ中,即发生IRQ中断时系统跳转到OS_CPU_IRQ_ISR处执行UCOS-II中断服务函数,具体事情由它负责。

IMPORT  OS_CPU_IRQ_ISR ;uCOS_II IrqISR	
EXPORT  HandleEINT0	 ;for os_cpu_a.s	

; Setup IRQ handler
	ldr	r0,=HandleIRQ       ;This routine is needed
	;ldr	r1,=IsrIRQ	  ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
	ldr	r1, =OS_CPU_IRQ_ISR ;modify by txf, for ucos 
	str	r1,[r0]

5.第二个关键点是需要是个时钟基准作为UCOS-II的时钟,这里使用S3C2440 的定时器0作为时钟基准。
#include “config.h”
U8 IntCnt;
void Timer0_ISR(void)
{
rSRCPND =rSRCPND|( 1 << 10);
rINTPND = rINTPND;
IntCnt++;
OSTimeTick();
}
void Timer0Init(void)
{
// 定时器设置

rTCON = rTCON & (~0xf) ;			// clear manual update bit, stop Timer0
rTCFG0 	&= 0xffffff00;					// set Timer 0&1 prescaler 0
rTCFG0 |= 15;							//prescaler = 15+1
rTCFG1 	&= 0xfffffff0;					// set Timer 0 MUX 1/4
rTCFG1  |= 0x00000001;					// set Timer 0 MUX 1/4
rTCNTB0 = (PCLK / (4 *15* OS_TICKS_PER_SEC)) - 1

rTCON = rTCON & (~0xf) |0x02; // updata
rTCON = rTCON & (~0xf) |0x09; // star
}

extern void OSTickISR(void);
void ISRInit(void)
{
// 设置中断控制器
rPRIORITY = 0x00000000; // 使用默认的固定的优先级
rINTMOD = 0x00000000; // 所有中断均为IRQ中断
pISR_TIMER0= (uint32) OSTickISR;
rINTMSK &= ~(1<<10); // 打开TIMER0中断允许
IntCnt=0;
}
6.编写主函数,添加任务等

编译链接源程序

1.出现如下错误,该错误是因为没有字节对齐引起的,在Os_cpu_a.s中添加语句PRESERVE8即可解决
在这里插入图片描述

烧写、调试

1.经过编译处理,已经没有错误,将代码烧写到开发板后,发现程序一进中断就崩溃。这是因为__irq关键字的缘故,Os_cpu_a.s包换有中断现场保护的代码,不需要编译器自动生成,所以所有中断服务程序需要去掉__irq关键字。
在这里插入图片描述
2.修改之后系统可以成功进行任务调度了。但是系统统计任务的占用率始终为0。检查源代码发现官方手册中给定的是1秒执行一次统计任务,而该源代码中是1秒执行十次。修改后占用率显示正常。

博客同款例程

https://download.csdn.net/download/weixin_41551104/13143363

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gui_x_ucosii.c是一个使用uC/OS-II实现的GUI驱动文件。在嵌入式系统中,GUI(图形用户界面)用于实现用户交互和图形显示,并且需要与操作系统进行良好的集成。 这个驱动文件的作用是将GUI与uC/OS-II操作系统进行整合和协调。它提供了一系列的函数和接口,用于在uC/OS-II环境下实现GUI的初始化、操作和事件处理等功能。 该文件主要包含以下几个重要的函数: 1. GUI_X_Init():该函数用于初始化GUI驱动。在uC/OS-II中,它会创建一个用于GUI任务的操作系统任务,并为任务分配堆栈和优先级等资源。 2. GUI_X_ExecIdle():该函数用于执行GUI的空闲处理。在uC/OS-II中,当没有其他任务可以执行时,系统会调用此函数。在该函数中,可以执行一些无关紧要的图形操作,如屏幕保护等。 3. GUI_X_GetTaskId():该函数用于获取当前任务的ID。在uC/OS-II中,每个任务都有一个唯一的ID,通过该函数可以获取当前GUI任务的ID。 4. GUI_X_WaitEvent():该函数用于等待GUI事件的发生。在uC/OS-II中,任务可以通过事件标志或消息队列等方式等待事件的发生,而GUI任务通常会使用此函数来等待鼠标点击、键盘输入等事件的发生。 通过这些函数和接口,gui_x_ucosii.c文件实现了GUI驱动与uC/OS-II操作系统的良好集成,使得我们可以在uC/OS-II环境下方便地开发和使用GUI功能。它为我们提供了一种简单、高效的方式来实现嵌入式系统中的图形界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值