STM8S Atomthread 实时操作系统移植
介绍
1.嵌入式操作系统基本知识
- 嵌入性、专用性与计算机系统是嵌入式系统的基本元素;跟通用计算机系统(如windows、linux等)相比,嵌入式系统具备专用性强、可剪裁性好、实时性好和功耗低的特点。
- 实时操作系统满足条件:
- 必须是多任务(任务调度或调度器,最核心功能)
- 任务的切换时间与系统当前任务数无关(调度器对任务切换时间)
- 中断延时的时间可预知并尽可能短(任务实时性要求,即为CPU对任务响应速度)
- 目前,实时系统主要类型:
- 抢占式(剥夺式)
- 非抢占式(非剥夺式)
2.实时操作系统介绍:Atomthread
- Atomthread完全开源、轻量、便捷,针对于嵌入式操作系统的实时调度。
- 具备特性:抢占式、无限的线程(在RAM允许的条件下)、255个优先级、相同优先级的时间片轮、任务同步与互斥、队列、定时器、具备元素的阻塞与非阻塞、线程的堆栈分析等系统基本元素。
- 对于初步学习操作系统的非计算机类学生来说是简便的,尤其是电子类学生或从事嵌入式设计的人是有效的系统学习对象。官方原生支持STM8系列CPU,配套电协第5代开发板,相应编写本教程,有助于大家进一步理解单片机系统。
- 系统文件组成:
文件名 | 文件作用 | 备注 |
---|---|---|
atom.h | 系统API | 任务控制块、系统错误宏、系统API等 |
atomkernel.c | 系统内核源码 | 内核功能:上下文切换、中断、TCB控制、信号量等 |
atommutex.c | 互斥源码 | ** |
atomport-template.h | 系统宏、类型声明 | 时间片轮设定 |
atomqueue.c | 队列源码 | ** |
atomsem.c | 信号量源码 | ** |
atomtimer.c | 定时器源码 | 系统滴答时钟、应用性定时器 |
3.注意:
- Atomthread官方网站:http://atomthreads.com/
- 以下编写当中,涉及到的变量、宏及函数等,通过()提供文件位置,请注意。
Atomthread(STM8版本)使用指南
1.STM8S版本特点
- 移植唯一需要修改的汇编文件。
- 编译器的特点: IAR编译器的虚拟寄存器、变量空间选择关键字等特点。
- Atom官方原生支持使用ST公司的官方库文件,应用代码都将使用库函数而不再是直接操作寄存器。学习需要注意数据结构体的设计和指针的灵活使用。
2.使用Atom基本流程:
- 系统初始化:设置空闲堆栈大小
- 启动系统时钟
- 根据实际调节系统时间片轮
- 根据实际调节滴答定时器
- 创建线程
- 设置任务堆栈大小
- 创建任务区(任务函数)
- 启动系统
3.电协
- 电协为广大的学习者,将ST库版本从1.1修改为V2.1(目前最新版本),库函数更完整。同时独自移植了一套直接操作寄存器的Atom版本,提供多种选择。本文,基于库函数版本编写。
- 实验平台:
- IAR V6.3
- 电协第五代开发板-B版
- 软件工具:source insight 3.5
- 电协修改后的源代码文件结构:
- kernel:Atom系统内核
- ports:特定平台(根据不同的芯片选择)
- lib:库函数
- inc:库函数头文件
- src:库函数源文件
- ports-stm8s:主程序和系统的端口代码,涵盖编译器的选择
- project:工程文件
- lib:库函数
- tests:Atom官方测试代码
- user:应用程序代码
- 学习建议:凡是讲述代码部分,建议正确打开工程,一步步跟着讲述,查看每一个提及到的变量、函数等,这样对系统加深理解。我们是学习实时系统的原理,而不单是使用它,而且要有信心优化系统。
原理:Atomthread系统的整体架构解析
1.程序控制块(atom.h)
操作系统是一种管理软件,负责管理对象的信息之余还按照某种规则对这些对象进行分配、调度,而实现这些操作的前提是需要有一份关于对象的详细信息,我们称之为程序控制块。从代码上看,程序控制块就是一个结构体。在Atom系统里面,程序控制块的组成简化如下图。
Atom系统里把上图所示结构体称之为ATOM_TCB(atom.h 4行),系统依赖于此结构来执行系统任务程序。
*注意:任务堆栈使用记录,是由ATOM_STACK_CHECKING宏决定是否存在TCB当中,如果不需要使用堆栈检测功能,可以根据宏来设置。