当前位置: 首页 > news >正文

Small RTOS51 学习笔记(10)Small RTOS51 的移植

个人笔记

文章目录

  • 准备一个 51 单片机工程
  • 将 Small RTOS51 相关文件添加到工程
  • 一个简单的程序
  • 运行效果
  • 遇到的问题

准备一个 51 单片机工程

我打算拿一个现成的 51 单片机工程来移植 Small RTOS51,

在这里插入图片描述
当然,也可以重新创建一个新的工程。

将 Small RTOS51 相关文件添加到工程

将源码目录的下面三个文件夹复制到我们的工程目录下,

在这里插入图片描述

下面的三个头文件其实都来自 “h” 文件夹,之所以把它们复制到项目根目录,一是可以省去包含头文件,二是即使包含了 h 目录下头文件,KEILC51 目录下的 OS_CPU_A.ASM 依然会报错(暂时没找到解决报错的办法,所以直接将头文件放到根目录)。

在这里插入图片描述

仿照源码目录下的几个例程,将 Small RTOS51 的源文件添加到 Keil 工程中,

在这里插入图片描述

在放 main() 函数的文件里添加 Small RTOS51 的总头文件 “config.h”,同时编写一个空的 mian()(没有任何实际功能的 main() ),编译工程,暂时没有报错。

在这里插入图片描述

根据工程目录修改 config.h 下的部分头文件的路径。例如,将原本的#include "..\os\OS.H" 改为 #include "os\OS.H" (貌似头文件识别不考虑大小写)

在这里插入图片描述

一个简单的程序

这是一个简单的测试程序,实现了 3 个 LED 的循环亮灭(3 个 灯相互独立,互不影响地”同时“闪烁)。

#include "config.h"

#define led_out  P2  //将单片机的P2端口定义为led,8个IO

void TaskA(void);
void TaskB(void);
void TaskC(void);

int main()
{
	// RTOS 初始化
	OSInit();	
	
	// 定时器初始化
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
	
	// 创建任务
	OSTaskCreate(TaskA, NULL, 0);
	OSTaskCreate(TaskB, NULL, 1);
	OSTaskCreate(TaskC, NULL, 2);
	
	while(1)
	{
			PCON = PCON | 0x01;   /* CPU进入休眠状态 */
	}
}

// 任务 A
void TaskA(void)
{	
	while(1)
	{
		OSWait(K_TMO, 250);
		led_out &= ~(0x1 << 0); // 第一个灯亮
		OSWait(K_TMO, 250);
		led_out |= (0x1 << 0); // 第一个灯灭
	}
}

// 任务 B
void TaskB(void)
{
	while(1)
	{
		OSWait(K_TMO, 250);
		led_out &= ~(0x1 << 1); // 第二个灯亮
		OSWait(K_TMO, 250);
		led_out |= (0x1 << 1); // 第二个灯灭
	}
}


// 任务 C
void TaskC(void)
{
	while(1)
	{
		OSWait(K_TMO, 250);
		led_out &= ~(0x1 << 2); // 第三个灯亮
		OSWait(K_TMO, 250);
		led_out |= (0x1 << 2); // 第三个灯灭
	}
}

上面这个测试程序能让 P2.0,P2.1 和 P2.2 三个引脚上的 LED 以 250ms 的间隔闪烁,但如果只添加上面这些代码,LED 的闪烁周期并不是 250ms。首先,定时器溢出周期 1ms 的前提是单片机外部晶振为 12MHz(可以参考我的另一篇笔记实验14:定时器0中断)

在这里插入图片描述
另外,我所用的单片机 STC89C52 定时器 0 在工作方式 1 的情况下,每次溢出后需要重新给定时器赋值(重载),这个任务需要在定时器中断里完成,Small RTOS51 默认将定时器 0 作为系统时钟源,系统时钟中断函数位于 OS_CPU_C.c 文件中,为了不破坏源码,我们选择在用户函数 UserTickTimer() 里添加定时器计数值重载的操作。

在这里插入图片描述
UserTickTimer() 并没有在源码中定义,需要用户自己定义。

// 系统时钟中断(定时器0中断)用户函数
void UserTickTimer()
{
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
}

Small RTOS51 默认没有使能系统定时器中断中的用户函数,需要修改 OS_CFG.h 下的 EN_USER_TICK_TIMER 宏的值。

在这里插入图片描述

运行效果

实物效果不方便展示,所以选择用仿真的方式:

请添加图片描述

遇到的问题

如果工程创建时添加了 STARTUP.A51 文件,需要将其从 Keil 工程中删除,不然会导致任务无法调度。

在这里插入图片描述
STARTUP.A51 一般是工程刚创建时添加的:

在这里插入图片描述

相关文章:

  • CentOS7 LVM 逻辑卷2种读写策略(磁盘IO性能优化)—— 筑梦之路
  • 湫湫系列故事——减肥记Ⅰ(Python)
  • 分享158个ASP源码,总有一款适合您
  • 机器学习常见面试问题汇总
  • 低代码:让企业“活”起来,赋能企业数字转型
  • SAP IFRS 17 面向服务架构详细解析(包含分类账规则)
  • JavaWeb:过滤器与监听器
  • SpringBoot Log4j2日志
  • 导致商标注册失败的四大原因?
  • Arx遍历块内实体
  • 剑指 Offer II 009. 乘积小于 K 的子数组
  • GF_CLR初始用 - 正式版
  • visual studio2019 定位内存泄漏的方法
  • 懂了委托,才算真正入门C#
  • Python | 数据类型之集合 | 函数
  • 全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like()等方法以及分页操作
  • 制药行业中各种化合物的净化,大孔吸附净化氨基酸
  • SpringBoot——玩转项目属性配置
  • SockJS-client简介
  • 1、Maven——Maven项目管理工具基本设置、把Maven集成到IDEA2022
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉