找回密码
 立即注册
查看: 3456|回复: 2

STC单片机uC/OS-II移植记(1):uC/OS-II 8051版移植历史

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
发表于 2023-3-21 03:52:20 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 2024-2-29 23:47 编辑

前  言
μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。(摘自百度)
自uC/OS-II引入中国,20多年过去了,国内单片机技术不断发展和单片机应用不断普及,已经非昔日可比了。目前STC推出了一系列的供学生和程序员学习的实验箱和开发板,其中最精简的一套组合的价格不超过30元:采用STC8H8K64U芯片的打狗棒开发板+USB转2串口兼烧录器,是学习单片机的最佳入门硬件基础。下图是这套组合开发系统的实物照片:
Fif_02_开发系统.jpg

使用RTOS编程是单片机开发的最高层次,而这套开发系统完全能够满足RTOS的入门和理论学习的硬件要求了。本文介绍如何移植uC/OS-II RTOS系统核心到这个STC8H系统上,使得学习者有一套可靠的原汁原味的uC/OS-II作为学习RTOS的出发点。
一、原汁原味的移植源

(1)uC/OS-II RTOS软件本身的结构非常严谨全面,而由发明人亲自撰写的《嵌入式实时操作系统 uC/OS-II》一书也从理论到实现详细地介绍了RTOS的方方面面。下图为该书第2版(2006年3月第5次印刷)的封面:
Fif_01_uCOSII-原著.jpg
该书附带了光盘,以开源的形式给出了在PC机上运行的范例和全套软件。自2001年该书翻译到中国以来就成了许多高校研究生和程序员学习、研究和应用RTOS的最佳软件和教材。
(2)移植RTOS有两种类型,一种是将RTOS移植到CPU架构(指令集)完全不同的目标机上,比如从采用80x86架构 CPU的PC机版本移植到8051架构CPU的单片机上,另一种是在CPU架构(指令集)相同但是结构体系不一样的单片机之间的移植。前一种移植的难度要大,对移植者的理论和实践水平要求很高。后一种难度较低,只要求移植者有该架构CPU的单片机的编程经验就行,适合想学习RTOS的入门者。本文是后一种移植方法,为RTOS的初学者提供一个入门的单元教程。

(3)本文的uC/OS-II程序移植源来自陈是知编著的《uC/OS-II内核分析、移植与驱动程序开发》(人民邮电出版社,2007年)一书的光盘,下图为该书封面:
Fig_03_uCOSII-移植.jpg
(4)可能是作者成功地将uC/OS-II从PC机版本移植到了8051架构单片机上,该书是笔者所读过的涉及uC/OS-II移植的书中最好的一本。

在该书中作者首先介绍了原来PC版的uC/OS-II范例,这些范例是运行在DOS环境下,用键盘控制在屏幕上显示各个任务的信息字符串,下图是第一个范例的开始任务部分:
Fig_04_开始任务.jpg
该书对uC/OS-II的范例和关键部分进行了逐行注释,特别适合入门者学习。
然后介绍了Keil的Cx51语言和编译器,最后给出了uC/OS-II内核的移植以及在8051单片机上编写uC/OS-II驱动程序的例子。

(5)移植源。本文的移植源取自该书第6章范例,放在本文程序附件的“01_原始版本_第6章”目录下。移植源有以下文件:
Fig_05_原始移植源.jpg
其中那些2005年的文件是该书没有移植的原始文件,2006年与2007年的文件是当初作者进行第一种类移植时建立的文件。

“252.Uv2”是移植项目文件,打开该项目时可以看到下图:
Fig_06_原始单片机.jpg
表明移植源的目标为“Winbond”公司的“W78E58B”单片机,这是一种早期的8051架构内核的单片机,其中在定时器0的中断里还需要每次都重新设置TH0和TL0。移植源项目使用Keil的C51编译器。
二、移植uC/OS-II内核到STC8H单片机上的关键点
(6)建立新的空项目。Keil的项目文件包含了许多单片机的具体编译信息,因此即使是同种架构CPU的单片机移植也要重新按照移植目标单片机新建项目,不建议用原来的项目进行改造。
新的空项目除了项目文件外,还要包含“STARTUP.A51”启动文件。附件中的“02_uCOSII_STC8H_空项目”给出了新的空项目程序。
下面是建立新的空项目的几个关键点:
1)选择单片机型号为STC8H8K64U系列:
Fig_07_选择单片机_STC8H.jpg
2)添加启动文件“STARTUP.A51”,选择“是”:
Fig_08_引导程序选项.jpg
3)建立好的空项目如下图:
XFig_09_空项目文件.jpg
(7)建立ST8H单片机uC/OS-II的系统项目。建立好空项目后,下一步就是对项目进行必要的设置和导入有效的和完整的uC/OS-II全部源程序文件。
1)设置RAM模式为大模式。内存选项见下图:
XFig_10_存储空间选项.jpg
由于在C51中缺省的重入函数空间由上面选项卡的“Memory Model”决定。由于IDATA空间只有256个字节,同时还是系统堆栈空间,因此不适合作为多任务的重入函数空间,多任务的重入函数空间应该建立在XDATA中。
本次移植的目标单片机STC8H8K64U有8KB的片上XDATA,所以选择将每个实时任务的堆栈空间建立XDATA空间,因此内存模式需要选择大模式,每个需要重入的函数只要加“reentrant”的关键字就行了。
2)复制要移植的uC/OS-II源文件。源文件包括以“.C”为后缀的C语言文件、以“.H”为后缀的C语言头文件和以“.ASM”为后缀的汇编语言文件。原项目中的“STARTUP.A51”、“C51BFPC.LIB”和“C51L.LIB”为老版本Keil编译器的文件,不需要复制到新项目中。

3)设置有内嵌汇编的C语言文件的属性选项。“serial.c” 源文件中的程序包含有内嵌汇编语言,所以该文件的汇编语言选项要打钩,如下图所示:
XFig_11_C语言内嵌汇编选项.jpg
(8)进行初次语法测试。新项目建立后,要先进行编译,进行文件的完整性和语法检查。如果一切顺利,可以编译成功,生成HEX文件。效果见下图:
XFig_12_初次编译测试.jpg
当然,把这时的HEX烧录到STC8H单片机上是没有反应的。
(9)硬件系统测试。
为了判断将来在移植中出现的问题是软件还是硬件的问题,对于移植目标开发板首先要测试其硬件系统是否工作正常。下面是运行打狗棒开发板的跑马灯范例的视频:
(见附件)视频1
(10)简化移植程序。本次移植的原程序中的多任务是以串口输出字符串为例子的,笔者认为作为移植的范例,应该越简单越直观越好,因此采用LED灯闪烁作为多任务运行指示。为此首先要从项目中删去两个串口驱动文件“serial.c”和“serial.h”,以及注释掉多任务程序中有关串口的语句。

(11)STC8H单片机的初始化和静态测试。移植目标STC8H单片机加电后所有的端口呈现高阻状态,必须要初始化后才能驱动LED灯。因此就用前面LED跑马灯范例中的程序来进行初始化和进行静态测试(多任务调度没有启动)。初始化和测试程序如下:
XFig_13_初始化.jpg
静态测试效果视频如下:
(见附件)视频2
(12)任务调度与动态测试。静态测试成功后,就可以进行任务调度的动态测试。打狗棒的P0到P3四个端口都连接有下拉的LED灯,因此可以用不同端口的LED灯闪烁代表不同的任务。下图是移植范例中三个任务的程序:
XFig_14_多任务.jpg
任务A是P0端口灯闪烁,任务B是P1端口灯闪烁,任务C是P2端口灯闪烁,下面是多任务开始运行的效果视频:
(见附件)视频3
(13)系统中断设置与中断服务程序。在uC/OS-II RTOS中使用一个定时器中断来产生节拍,在每个节拍里系统就会进行任务调度。本次移植的uC/OS-II系统中断为50Hz,STC8H工作频率为33.1776MHz,因此要修改定时器0的设置,具体见下图:
XFig_15_定时器.jpg
同时,移植换了单片机,中断服务程序也要做相应的调整,具体的见下图:
XFig_16_ISR.jpg
原程序中的第423到426行应该注释掉,STC8H系列定时器有自动重装功能,不需要每次中断重新设置。
另外第435行开始的串口中断服务程序,也应该被注释掉。
三、移植要点说明
经过上面步骤,uC/OS-II内核就算移植成功了,移植的结果见附件中的“09_uCOSII_LED灯闪烁_系统中断”子目录。
(14)移植中需要修改的系统文件。uC/OS-II是一个精心设计的系统,核心源程序用C语言编写,适合移植到各种目标机。
按照该系统的程序结构设计,在进行移植过程中需要移植者重写或者修改三个系统文件和两个用户文件:“OS_CPU.H”、“OS_CPU.C”和“OS_CPU_A.ASM”,以及单片机引导程序“STARTUP.A51”和C语言主函数文件“main”。

(15)OS_CPU.H文件。这个头文件定义了临界区保护的方法、堆栈的生长方向和任务切换函数。这个文件笔者没有对陈是知的程序做修改,直接保留了它:
(16)OS-CPU.C。这个文件包含两个主要内容,一个是对任务堆栈结构的定义和初始化,另一个是对系统中断的初始化。
由于移植前后的单片机不同,笔者仅改变了对系统中断定时器0的初始化函数,将主频提高到33.1776MHz,具体见“(13)系统中断设置…”一节。
(17)OS_CPU_A.ASM。在这个汇编语言文件中,笔者仅删除了定时器0中断服务程序中对定时器的再设置部分和串口中断部分。
(18)单片机启动文件“STARTUP.A51”对于不同型号的单片机是不同的。笔者根据STC8H8K64型号单片机的规格修改了它。
(19)主函数“main”,笔者修改了系统硬件初始化程序和多任务的定义。
四、uC/OS-II编程框架
每个程序员的编程风格不同,通常在移植成功后,移植者会根据自己的理解给出一个编程框架,指导用户进行实际应用。笔者也按自己的程序风格给出了进行RTOS编程的框架范例。范例程序见附件中“10_uCOSII_STC8H_编程范例”子目录,下面对其中的“main.c”函数进行解读。
(20)系统定义部分,见下图。
XFig_21_系统定义.jpg
第17行程序是系统定义。uC/OS-II将核心功能所有的头文件集中在一起,包括单片机的头文件,一般用户程序只要包含它就行了。
第20行到第22行是实时任务函数预定义,第25行到第27行是实时任务堆栈定义。

uC/OS-II有两种建立任务的方式:基本的与扩展的。由于移植源只处理了基本的建立任务的方式,因此所有任务的堆栈都只能是同样长度的,这个长度“MaxStkSize”是一个宏定义,定义为900个字节。见下图:
XFig_21B_堆栈长度.jpg
如果用户定义任务堆栈的长度大于“MaxStkSize”,则会产生XDATA空间浪费,如果小于“MaxStkSize”,则会产生任务堆栈错位,造成程序跑飞。
由于STC8H单片机采用的一次烧录运行的方式,且8KB的RAM内存资源较少,难以像PC机DOS程序可以在运行中建立和删除任务,并且在STC8H单片机上即使删除了任务,该任务占用的CODE空间Keil的C51编译器也没有办法再复用。因此本范例采用建立静态任务的方法,先预定义任务函数和静态堆栈,然后在主函数“main”中建立任务。

(21)主函数部分,见下图。
XFig_22_主函数.jpg
第33行到第40行是端口初始化程序。STC8H单片机端口的准双向口模式最为接近传统8051单片机的端口特性,一般在老8051单片机运行的程序都能通过。
第43行是对系统中断定时器0的初始化。第46行是关闭定时器0的计数,禁止任务调度。
将uC/OS-II移植到8051单片机上,一般都选择进入临界区保护的方法是关闭中断,退出临界区保护的方法是打开中断。在设置系统中断定时器之后,如果调用了那些有临界区保护的(像建立任务等)uC/OS-II核心函数,则系统中断会被打开,如果这时RTOS系统没有正确配置好,定时器0的中断就会启动,继续执行程序就可能产生预料不到的后果,因此只能马上关闭定时器0的计数功能,来避免系统中断的产生,直到RTOS系统正确配置好,然后在第一个任务中打开计数,启动任务调度功能。
第49行进行RTOS系统初始化,初始化各种表格和建立初始化的运行状态。
第52到54行建立了三个用户实时任务。用户任务的建立与建立次序没有关系,只是要注意建立任务函数的最后一个参数是该任务的优先级数,优先级数越小,优先级越高。
第57行是启动任务调度程序,从此就将CPU的执行权交给用户的任务了。即使所有的用户任务都没有就绪,CPU执行权也会交给“空闲任务”来执行,并且uC/OS-II采用特殊的程序结构,保证“空闲任务”永远不会被退出。因此第57行程序应该是“main”函数的最后一行程序,其后面的程序永远不会被执行。

(22)三个用户实时任务程序见下图:
XFig_23_多任务.jpg
从程序结构上看,每个任务都包含一个无限循环,在循环前有一个前置部分,这与单片机平常程序的“main”主函数结构一样。每个任务第一次得到CPU控制权时从任务函数开始的地方开始执行,直到被任务调度暂停或者任务程序控制暂停,然后下一次任务再得到CPU控制权的时候,程序从暂停的地方开始执行。因此从任务函数开始到无限循环“Main_Loop”之间的程序只会被执行一次。
第61到74行是任务A函数,由于它的优先级数是2,优先级最高,所以它肯定最先得到执行。
任务A的第65行程序打开定时器0的计数,系统中断计数随即产生,任务调度程序开始执行,自此RTOS系统开始正常运行。
为了加强范例程序的演示效果,本范例任务A是LED灯交替闪烁,任务B是LED灯左右闪烁,任务C是跑马灯。
在这些任务程序里,uC/OS-II系统函数“OSTimeDly”是让任务以系统节拍(20毫秒)为单位休眠指定的时间(从任务的角度叫延时Delay,从系统的角度叫休眠Sleep),休眠结束后继续执行任务后面的程序。

下面为本范例的演示效果视频:


0701_uCOS-II移植_视频1.mp4

1.57 MB, 下载次数: 88

0701_uCOS-II移植_视频2.mp4

2.37 MB, 下载次数: 61

0701_uCOS-II移植_视频3.mp4

6.17 MB, 下载次数: 66

0701_uCOS-II移植_视频4.mp4

3.54 MB, 下载次数: 70

0701_uCOS-II移植_STC8H_程序.rar

1.91 MB, 下载次数: 163

回复 送花

使用道具 举报

  • TA的每日心情
    开心
    21 小时前
  • 签到天数: 137 天

    [LV.7]常住居民III

    1

    主题

    106

    回帖

    1893

    积分

    金牌会员

    积分
    1893
    发表于 2023-3-21 17:18:49 | 显示全部楼层
    大师大作
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    8

    主题

    79

    回帖

    1088

    积分

    金牌会员

    机长

    积分
    1088
    发表于 2023-3-23 22:44:59 | 显示全部楼层
    大师之作,前排留名!
    业余撸代码,专业开飞机
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-17 22:09 , Processed in 0.066109 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表