0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于M16C62单片机构成的实时多任务系统

电子设计 来源:电子设计 作者:电子设计 2020-10-30 11:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着微电子技术和网络的发展,人们对网络的认识日益深入。网络终端产品也越来越受到人们的关注,嵌入式操作系统的应用也得到了前所未有的发展,人们对嵌入式的研究也有了长足的进步。基于某个操作系统的实时、多任务系统的设计合应用成为单片机应用的新的发展趋势。

μC/OS-Ⅱ是一个源码公开的实时嵌入式操作系统,它的特点在于公开的源代码,很强的移植性,占先式多任务,每个任务有单独的栈,中断管理及很强的稳定性与可靠性等,目前越来越受到实时嵌入式系统设计者的关注,本文详细讲述了如何把 uC/OS-II 操作系统移植到 M16C62 单片机中,并给出了以 M16C62 单片机为核心处理器构成的一个实时多任务系统的设计方案。


1、uC/OS-II 的移植

uC/OS-II 采用完全占先式的实时内核,最多可以管理 56 个任务,每个任务对应一个不同的优先级,因而,uC/OS-II 操作系统并不支持时间片轮转调度法。但是全部 UC/OS-II 的函数调用与服务的执行时间是可知的,也就是,uC/OS-II 系统服务的执行时间不依赖于应用程序任务的多少。另外,uC/OS-II 中每个任务都有自己单独的栈,每个栈的大小可以根据应用程序的需要进行分配,这样压低了系统对 RAM 的需求;在中断管理方面,uC/OS-II 中的中断可以使正在执行的任务挂起,如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,uC/OS-II 的中断嵌套可达 255 层。

uC/OS-II 的源码大部分是用可移植性很强的 ANSI C 写的。只是和微处理器有关的很小一部分代码是用汇编写的,这样把 uC/OS-II 移植到 MC16C62 中就变得相对容易很多,主要是要修改和处理器有关的代码,如:OS-CPU.H、OS-CPU-A.ASM、OS-CPU-C.C。

(1)、OS-CUP.H 头文件

OS_CUP.H 头文件主要是定义和处理器有关的数据类型,在 M16C62 中的数据类型包括无符号整型、有符号整型、无符号字符型、有符号字符型等。因此,OS_CPU.H 头文件对这些类型进行全新的定义。除了和处理器有关的数据类型定义外,在 OS-CUP.H 中还作了有关中断禁止、中断允许、堆栈的增长方向等一些简单宏的定义。

(2)、OS-CPU-A.ASM 文件

在 OS-CPU-A.ASM 文件中包含四个汇编语言的函数:OSSTartHighRdy()、OSCtxsw()、OSIntCtxsw()、OSTickISR()。在 uC/OS-II 中处于就绪态的任务的堆栈结构,看起来和刚中断的情形是一样的。要想运行最高优先级任务,移植要做的是就是将所有处理器的寄存器按顺序从任务堆栈中恢复出来,并且通过一条中断返回语句来实现任务的切换。因而,OSStartHighRdy()就是使要恢复的任务堆栈指针指到任务控制块的 0 偏址的内存单元中。也就是要把保存在任务堆栈中的数据以及 CPU 寄存器,如 R0、R1、R2、R3、A0、A1、SB 和 FB 返回到系统当前的寄存器中,并把当前堆栈指针指到 PC 指针的位置。

在 uC/OS-II 中任务的切换问题是通过发软件中断命令或依靠处理器执行陷阱指令来完成的。但是中断服务例程、陷阱或异常处理例程的向量地址必须指向 OSCtxSw()。在 M16C62 单片机中可以通过定义软件中断 0 来完成任务的切换。因而,在 M16C62 中的中断向量表中的 0 号软件中断地址指向 OSCtxSW()。对应的中断号为 0。

OSInCtxSw()用来在 ISR 中执行切换功能。由于这个函数本身就是在中断中被调用,因而,在中断处理时寄存器的状态已经都被正确保存了。在 OSInCtxSw()函数中要进行堆栈清理工作,只有这样被中断的任务的堆栈内容才能正确返回。

OSTIckISR()这个函数时 UC/OS-II 所要求的时钟基准,即时钟节拍,uC/OS-II 的时钟节拍频率在 10 到 100 之间,通常为了计算方便而设为整数。在 M16C62 中有多个定时计数器可以选择用来作为系统的时钟基准。在该系统中利用时钟定时器 A0 来产生频率为 100 的一个时钟节拍。OSTIckISR()是一个中断响应函数,因而必须在 M16C62 的中断向量表中,A0 的中断向量应分配给 OSTIckISR(),对应的中断向量号是 21。

(3)、OS_CPU_C.C 文件

在这个 C 文件中包含 6 个简单的 C 函数,而这 6 个函数中和移植关系最密切的 OSTaskInit()函数,这个函数是用来创建一个任务堆栈。OSTaskCreat()和 OSTaskExt()就是通过调用这个函数来初始化任务的堆栈结构的,由此看来,OSTaskInit()是移植的关键。在前面的 OS_CPU_A.ASM 文件中,任务的切换是通过调用一个软中断 0 来实现任务切换,通过中断的返回指令使堆栈中的数据返回到 CPU 寄存器,使最高优先级的任务占有 CPU,因而,OSTaskInit()函数要做的就是模拟中断发生时处理器压栈的过程,把 CPU 的寄存器内容压到任务堆栈中。在 M16C62 单片机中,系统分为两个堆栈,即:用户堆栈和中断堆栈,而在 uC/OS-II 进行任务切换是通过软中断 0 来实现的,因此,uC/OS-II 的任务堆栈是 M16C62 中的中断堆栈。

中断堆栈中依次保存程序计数器 PC 和标志寄存器 FLG 中的内容,因此,在 OSTaskStkInit()函数中就是要模拟这样的一个压栈过程。先压入 FLAG 的高四位和 PC 指针的高四位,接着压入 FLAG 低位、PC 中间八位和 PC 的低八位。在保存完 PC 和 FLAG 位后就应该为 CPU 的寄存器 FB、SB、A1、A0、R3、R2、R1 和 R0 分配相应存储空间。OSTaskInit()函数返回的是任务堆栈的指针。

2、多任务系统设计

多任务系统的设计是以 M16C62 单片机为 CPU,以 uC/OS-II 为操作系统构成一个实时多任务系统,系统包括一个基于 SPI 总线的温度传感器(DS1722)、一个基于 I2C 总线的实时钟(X1226)、一个 LCD(JM202A)和键盘。M16C62 工作在微处理器模式,片外扩展一个 32K×16 位的 RAM(Cy7c1021b)和由两片 EEPROM(EEP29010-90)构成的存储器。多任务系统的设计主要包括:单片机资源分配和多任务设计两个方面。

(1)M16C62 单片机资源分配

M16C62 单片机是一个 16 位单片机,线性寻址空间是 1M,但片内的 RAM 大小只有 3Kbyte,因此要使多任务系统能正常稳定地工作必须合理分配资源。uC/OS-II 中所有内核代码必须在 RAM 区而把系统堆栈区划块到 3K RAM 区外。通过对 Ncrt0.a30 和 Sect30.inc 这两个 M16C62 配置文件,可以完成对单片机的资源划分。NC30 编译器一开始就会编译 Ncrt0.a30 和 Sect30.inc 这两个文件,完成对 CPU 的初始化,和资源分配,主要包括:存储器空间、RAM 区分配、中断向量分配、堆栈区划分等。

(2)多任务设计

该系统中除了 uC/OS-II 的空闲任务外,还包括实时钟任务、温度采集任务和键盘中断任务和数据存储任务。实时钟主要是能精确记录系统的日期,任务优先级为 10,该任务处于一直工作状态;温度采集任务的优先级为 20,主要是完成温度数据的采集;数据存储任务是在温度发生较大变化的时候记录当时的时间和温度,任务优先级为 30,在一般情况下这个任务是处在挂起状态,一旦温度变动超过预置范围,温度采集任务就会发出一个有效信号量使处于挂起态的数据存储任务转为就绪态。键盘中断任务是通过 M16C62 的键盘中断来完成参数的设定,该任务以一个中断处理函数的形式来完成的。

3、结束语

把 uC/OS-II 移植到 M16C62 单片机中,并以 M16C62 单片机为微处理器构成一个实时多任务系统,不仅系统设计简洁、硬件结构相对与 51 系列单片机来说也要简单,而且具有较强的抗干扰能力和系统稳定性。以 M16C62 为微处理器,以 uC/OS-II 为实时操作系统构成的多任务系统能广泛应用在小型实时多任务系统中,具有较好的应用前景。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663528
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    多任务系统中,如何平衡任务调度以防止因高负载导致的再次进入低功耗模式的延迟?

    多任务系统中,如何平衡任务调度以防止因高负载导致的再次进入低功耗模式的延迟?
    发表于 12-04 06:37

    单片机启动&库函数的构成

    的脉冲,故单片机的时钟信号可以由RC振荡器提供。但是RC振荡器提供的时钟信号质量不高,而晶体振荡器依靠压电效应提供稳定的、高质量的时钟信号。 以CW32F030C8T6单片机为例,他拥有2个内部
    发表于 11-18 08:15

    C语言和单片机C语言有什么差异

    单片机c语言相对于普通C语言增加了一些基本的指令,还有变量的赋值是16进制,当然单片机c语言只牵
    发表于 11-14 07:55

    单片机的操作系统

    单片机操作系统主要分为实时操作系统(RTOS)和嵌入式操作系统两类,以下是常见选择: 实时操作
    发表于 11-14 06:18

    32位MCU芯片国产品牌(32系列单片机常用型号有哪些)

    、RAM及多种通信模块(如UART、SPI、I2C、USB等),在实时控制、复杂运算和多任务处理方面优势显著,尤其适用于需要高性能和低功耗并重的场景,例如智能家居、电机驱动、穿戴设备及工业自动化
    的头像 发表于 11-13 16:31 670次阅读

    MS32C001单片机芯片介绍

    MS32C001单片机是一颗高性价比的入门级微控制器,采用了高性能的 32 位 ARM Cortex-M0+ 内核,宽电压工作范围。芯片嵌入18 KB Flash 和 1.5 KB SRAM 存储器
    的头像 发表于 09-05 16:41 1607次阅读
    MS32<b class='flag-5'>C</b>001<b class='flag-5'>单片机</b>芯片介绍

    单片机芯片选择方案与论证

    电子(低成本)、物联网(低功耗+无线)、汽车电子(高抗干扰)等。 任务复杂度 :是否需要浮点运算、多任务调度或实时操作系统(RTOS)? 通信需求 :是否需要Wi-Fi/BLE(如ES
    的头像 发表于 08-11 09:57 776次阅读

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机
    的头像 发表于 07-25 11:39 476次阅读

    给予单片机的温度控制系统设计

    、执行机构、显示模块和电源模块组成。单片机系统的核心,负责处理温度信息并发出控制指令;温度传感器用于实时采集环境或物体的温度数据,将物理量转化为电信号传输给
    的头像 发表于 07-16 10:57 452次阅读

    MS32C001-C系列单片机的主要特性

    MS32C001-C系列单片机是一颗高性价比、低功耗的小资源MCU,适合低成本项目使用。芯片内置32位ARM Cortex-M0+内核,主频可达24MHz。嵌入 18 KB Flash 和 1.5
    的头像 发表于 07-10 14:21 1399次阅读
    MS32<b class='flag-5'>C001-C</b>系列<b class='flag-5'>单片机</b>的主要特性

    嵌入式和单片机,是同一个东西吗?

    (RTOS)或没有任何操作系统的裸机编程。软件方面,嵌入式系统可能使用专门的编程语言,如CC++或汇编语言,这些语言能够提供对硬件的直接控制和高效的运行性能。
    发表于 07-09 10:20

    Linux嵌入式和单片机嵌入式的区别?

    单片机嵌入式 :开发环境相对简单,通常使用C语言或汇编语言进行编程,开发工具包括Keil、IAR等。 Linux嵌入式 :开发环境较为复杂,除了需要掌握C语言,还需要了解Linux操作
    发表于 06-20 09:46

    快速入门——LuatOS:sys库多任务管理实战攻略!

    的开发者,这里将用最简明的步骤,助你轻松实现多任务应用开发! sys库是LuatOS的核心系统调度库,它基于Lua协程机制实现了实时多任务调度、定时器管理以及消息通信等功能。 在详细介
    的头像 发表于 05-29 14:36 597次阅读
    快速入门——LuatOS:sys库<b class='flag-5'>多任务</b>管理实战攻略!

    爱普生S1C17M00/M10系列16位微控制器核心功能

    在现代电子设备的广泛应用中,对于能够实现多种功能集成的微控制器(MCU)的需求日益增长。爱普生S1C17M00/M10系列正是为满足这一需求而设计的高性能、低功耗的16单片机。它们广
    的头像 发表于 03-14 13:54 863次阅读
    爱普生S1<b class='flag-5'>C17M</b>00/<b class='flag-5'>M</b>10系列<b class='flag-5'>16</b>位微控制器核心功能

    AN4121-采用PIC16F单片机进行系统电源控制

    电子发烧友网站提供《AN4121-采用PIC16F单片机进行系统电源控制.pdf》资料免费下载
    发表于 01-21 14:42 0次下载
    AN4121-采用PIC<b class='flag-5'>16</b>F<b class='flag-5'>单片机</b>进行<b class='flag-5'>系统</b>电源控制