本帖最后由 你能行1、 于 2016-6-13 23:08 编辑
经过两周的学习,完成了uCOSII+ucGUI+触摸屏在STM32上的移植。在此感谢众多网友的分享,为此,我把我的移植经验总结出来与大家分享。 实验条件: CPU: STM32F103VCT6 LCD Driver: SPFD5408A 屏幕尺寸: 2.8寸 uCOSII Version: V2.86 ucGUI Version: V3.90
移植步骤:1、移植uCOSII,实现多任务调度; 2、在uCOSII基础上移植ucGUI,实现简单控件显示; 3、移植触摸屏,实现触摸屏输入; 一、移植uCOSII,实现多任务调度 1、准备工作。 准备好一份可以点亮LED灯的STM32裸机工程文件,一份uCOSII源码。
一、移植uCOSII,实现多任务调度 1、准备工作。 准备好一份可以点亮LED灯的STM32裸机工程文件,一份uCOSII源码。
点亮LED灯STM32代码
uCOSII源码文件 2、拷贝相关文件。 2.1把uCOSII源码文件夹位置...uCOSMicriumSoftwareuCOS-II源码文件夹下的Source文件夹拷贝到..._2_STM32_CirleTwoLEDucosii文件夹下。
2.2把uCOSII源码文件夹位置..uCOSMicriumSoftwareuCOS-IIPortsARM-Cortex-M3GenericRealView下的所有文件拷贝到..._2_STM32_CirleTwoLEDucosiiPort文件夹下。因为是用Keil编译器,所以拷贝的是RealView文件夹下的文件,如果是用IAR编译器,清拷贝RealView文件夹下的文件。
2.3 把uCOSII源码文件夹位置..uCOSMicriumSoftwareEvalBoardsSTSTM3210B-EVALRVMDKOS-Probe文件夹下的app_cfg.h和os_cfg.h拷贝到工程文件..ucosiiConfig下。
2.4 拷贝完文件夹如图所示。这三个文件夹装的就是从ucosii源码拷贝过来的文件。
3、把ucosii源码加入到Keil编译器。
3.1 添加source文件夹的所有文件,这个文件夹只有.c文件。
3.2 添加prot文件夹下文件。该文件夹要添加.h和.asm文件,因此,在选择文件类型的时候,要选择All files,否则默认情况只能看到.c文件。记得,一定要添加.asm文件,否则编译会出错。
3.3 添加Config文件夹下的.h文件。
4、包含编译路径。
5.1 由于ucosii需要一个节拍时钟,而STM32内部刚好有一个tick定时器,可以作为节拍时钟。 从开发板例程文件里找到stm32f10x_it.c和stm32f10x_it.h文件,并拷贝到工程文件的bsp文件下,加入到工程中。在stm32f10x_it.c添加#include头文件。
在stm32f10x_it.c找到SysTick_Handler函数,这个是系统滴答定时器中断。在该中断服务函数添加如下代码。
5.2 既然用到了tick中断,那么就要配置tick定时器寄存器,在user_task.c文件下加入配置tick定时器寄存器,如下所示;
6、STM32硬件BSP初始化 6.1 拷贝与硬件相关的驱动代码到bsp文件夹,如下图所示;
6.2将与硬件相关的文件加入到Keil工程下,并包含头文件路径。
7、修改ucosii文件。 7.1 此ucosii源码是从官方下载的,并且是与STM32相匹配的源码。但是,这里我采用的是STM32内部Tick定时器作为节拍时钟,跟官方提供的源码采用方法不同,所以要做相关修改。 7.2 在keil工程ucosii/port下找到os_cpu.c,把void OS_CPU_SysTickInit(void)、void OS_CPU_SysTickHandler(void)这两个函数注释掉。这两个函数是在没有tick定时器情况下,为ucosii提供节拍时钟的函数,由于我们用了tick定时器作为节拍时钟,所以要把它们注释掉。注释了函数体,要记得到os_cpu.h把函数声明也给注释掉。
7.3 如下图,我们可以看到,SysTickHandler这个函数里面的内容,跟我们拷贝到stm32f10x_it.c下的SysTick_Handler函数的内容是一样的。
7.4 在os_cpu.c文件里,由于我们没用到钩子函数,所以注释掉OSTaskCreateHook、OSTaskDelHook、OSTaskIdleHook、OSTaskStatHook、OSTaskSwHook、OSTCBInitHook、OSTimeTickHook函数里面的内容。注意,只是里面的内容,函数名不要注释。屏蔽这些钩子还有一个办法,就是把相关钩子函数的宏定义置位0,这些宏定义在os_cfg.h中。
7.5 在os_cpu.c文件头部,找到如下图所示的宏定义,把它们都注释掉。
7.6 最后,记得,要修改startup_stm32f10x_hd.s(不同容量的芯片,这个文件名字不完全相同,我这个是中等容量的启动文件)文件。这个文件主要是更换PendSV挂起中断服务函数。由于ucosii重写了PendSV中断服务函数PendSV_Handler,函数名为OS_CPU_PendSVHandler,函数原型在os_cpu_a.asm文件里,通过os_cpu.h进行声明。把startup_stm32f10x_hd.s里面的PendSV_Handler更换成OS_CPU_PendSVHandler即可,一共有三处,分别是76行,193行,194行。
8、添加用户任务 8.1 在user_task.c文件,添加系统启动任务,在红框范围添加用户任务,格式如下如所示;
8.2 定义任务堆栈数组和堆栈大小
8.3 ucosii是实时抢占式操作使用,因此,每个任务都有一个优先级。当同一时间,有多个任务同时申请CPU执行权,但是同一时间CPU只能执行一个任务,因此就会出现优先级高的任务先执行,优先级低的任务在等待任务队列等待。任务的优先级由程序员在编写程序的时候,根据任务处理的紧迫情况而定,数字越小,表示任务优先级越高。一共有255个任务优先级,有几个是被系统占用的(有4个,忘了具体名字了),一般是最后那几个。
8.4 任务优先级有一个限制,在os_cfg.h头文件里定义了OS_LOWEST_PRIO宏定义,是限制优先级范围的。注意,此值不能大于254!
8.5 在main.c文件添加ucosii系统初始化函数OSInit(),创建启动任务,调用OSStart()启动ucosii。
8.6 定义启动任务堆栈。STARTUP_TASK_STK_SIZE在app_cfg.h文件有定义,直接拿过来用即可。
9、到此,完成了ucosii在STM32的移植,下载到开发板,可以看到两颗LED交替闪烁,达到了任务调度的目的。如果LED没有交替闪烁,请参考以下错误解决方法。
10、错误示例 10.1出现钩子函数没有定义,说明还没屏蔽掉os_cfg.h里面的钩子函数,请参考7.4和7.5点。
10.2 任务无法调度。 原因1:stm32f10x_it.c文件里的SysTick_Handler函数没有修改 原因2:startup_stm32f10x_hd.s文件里面的PendSV_Handler还没更换成OS_CPU_PendSVHandler。
以上是本人在移植过程中遇到的一些问题,把它记录下来,希望对大家有用。
11、总结 由于硬件平台不同,移植有一定差别。本人只是提供一个参考,一个移植的思路。在移植过程中,ucosii源码一般是不用修改的,也就是ucosii/port下面的.c文件是不需要改动的。只需要修改ucosii/config和ucosii/port下的os_cpi.c、os_cpu.h、app_cfg.h、os_cfg.h的内容即可。 ucosii就是通过这些头文件来配置系统内核的,这些是系统对外的接口。 由于本人手上的这份ucosii源码是从官方下载,并且是与STM32相匹配的,所以修改的地方不多,如果不是与STM32相匹配的源码,还要修改堆栈之类。这类移植,要参考网上其它教程。
与硬件平台相关驱动文件,要根据自己手上硬件进行移植。首先要保证这些底层驱动工作是正常的,如果驱动不正确,移植过去的系统调用这些底层驱动的函数接口,也无法实现相关的功能。
/****************************************************************************************/
这里只写了ucosii在STM32的移植教程,有关ucgui和触摸屏的实验教程,请参考云盘里面的PDF文档。 再次感谢论坛众多朋友的分享。。。
本文所有代码在百度云盘,里面有详细教程。 来两张效果图 |
|
|
|
ddddddddddddddddddddddddddddd
|
|
|
|
|
UCOSII+UCGUI 基于STM32的移植真的是个好东西,标记一下
|
|
|
|
|