找回密码
 立即注册
查看: 1268|回复: 7

Ai8051U单片机,从入门到精通(10):虚拟开发板、虚拟单片机和实时任务独立编程

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-9-15 23:54:03 | 显示全部楼层 |阅读模式
一、“玫瑰一号”虚拟开发板
(1)学习单片机RTOS的目的是为了在实际中应用它,而实际应用场景千差万别,因此就需要先抽象出一个开发模型来进行学习和研究,通常这个开发模型就被称为“虚拟开发板”
(2)AI8051U单片机已经具有强大的性能,其典型应用场景是作为一个“工业控制主机”,通常这个工控机上首先要有若干个红红绿绿的指示灯来显示系统运行的状态,比如一闪一闪的生命灯,比如系统总电源开关指示灯和各个设备启停指示灯。其次这个工控机上要有一个数码管实时地显示系统的运行参数,最简单地是显示运行时间。最后这个工控机还应该通过网络与上位机通讯,向上位机传送各种运行状态信息和接收各种命令。
以下将这种最小工控机模型称为“玫瑰派一号”虚拟开发板
(3)“玫瑰派一号”虚拟开发板具有8个LED灯、一个8位数码管和连接在P30P31上的供烧录和通讯用的串口UART1
AI8051U实验箱是一款功能强大的学习和研究设备,上面正好有这三个独立的部分,因此正好可以抽象出一个“玫瑰派一号”虚拟开发板
下图是AI8051U实验箱实验箱的实物照片:
Fig_01_实验箱.jpg
图中上部的8位数码管,中间一排的LED灯。

二、RTOS的每个实时任务相当于一个虚拟单片机
(4)金山151-RTOS具有5个实时任务,空任务的框架程序如下:
Fig_02_实时任务.jpg
其中任务0~任务3为空任务,任务4是留守任务。
(5)从上面框架中可以看出,金山151-RTOS的每一个实时任务都是独立的,每一个实时任务都是同样的结构:从函数开始到“Main_Loop”标号之间是任务的初始化部分,比如第57行程序,然后从“Main_Loop”标号到无条件转移语句“goto Main_Loop;”之间是一个无限循环部分。这也说明每一个实时任务都是不允许退出的。
有人问笔者为什么不使用“while(1){...}”这种方式来实现无限循环结构,这是因为每个RTOS的实时任务函数或者裸机编程的“main()”函数都是不能退出的,退出可能产生系统崩溃的严重后果,采用上面的“goto”语句方法来实现无限循环,可以避免使用“break”语句不正确导致的意外退出主循环,进而退出任务函数的后果。
(6)对比实时任务的函数结构与单片机裸机编程的“main()”函数结构,两者都是一样的,因此我们可以把每个独立的实时任务抽象成为一个“虚拟单片机”,在RTOS任务调度系统的协调下多个虚拟单片机同时运行。比如对于高运算能力的AI8051U系列单片机,采用金山151-RTOS编程,就好像5台单片机同时运行,可以充分发挥AI8051U单片机的速度和内存优势

三、RTOS的实时任务的独立编程方法
(7)对于一个RTOS系统,如果其中某一些设备是独立控制的,那么就可以把这些独立设备看做是一个单独的虚拟单片机,用一个实时任务来进行控制,对这个实时任务的编程就像裸机编程中的“main()”函数一样可以独立地编程。
(8)本文范例将AI8051U实验箱的右面4个LED(对应P04、P05、P06、P07)作为一个虚拟单片机用任务0来进行控制,程序见下图:
Fig_03_任务0.jpg
这是一个跑马灯程序。

(9)本文范例将AI8051U实验箱的左面4个LED(对应P00、P01、P02、P03)作为一个虚拟单片机用任务1来进行控制,程序见下图:
Fig_04_任务1.jpg
这是一个花样灯程序。
(10)任务0和任务1的编程方法称为“直写法”:将实现功能的程序按照节拍依次写出来,这也是最基本的编程方法。

(11)本文范例将AI8051U实验箱的左面4个数码管(第0、1、2、3号数码管)作为一个虚拟单片机用任务2来进行控制,程序见下图:
Fig_05_任务2.jpg
这是一个典型的独立任务的“main()”函数结构,第88行是变量定义,第90行是变量初始化,第91行到第103行是一个无限循环结构。
任务2是将十六进制数字在这个4个数码管上不停地向左滚动。
(12)任务2的编程方法是“制造循环法”。这个方法是找出整个控制过程的最大循环圈,把它作为程序的主循环过程,然后逐步地写出其中的过程。
(13)金山151的数码管驱动方式与AI8051U实验箱的不同,在数码管缓冲区“JS151_DRV_DIG8_DATA_BUF[0]” ~“JS151_DRV_DIG8_DATA_BUF[7]”中,每个字节存放对应数码管的7个笔画和小数点的二进制数据。采用这种形式存放,每个数码管就可以显示全部255种图案,把相邻的数码管组合起来,不但可以显示数字字母,而且还可以显示各种动画图形。
上面语句中的JS151_DRV_DIG8_SYMB_LUT[n]是从符号查找表中将第n号符号的笔画取出来。

(14)本文范例将AI8051U实验箱的右面4个数码管(第4、5、6、7号数码管)作为一个虚拟单片机用任务3来进行控制,程序见下图:
Fig_06_任务3.jpg
任务3是把右面4个数码管作为一个3位数的计数器来使用。其中第112行程序让4号数码管不亮,第115、118和121行分别显示百位、十位和个位。

下面是本范例四个独立任务运行的视频效果:


四、RTOS任务调度的基本工作原理
(15)上面4个独立的实时任务都是按照一定的节拍对设备进行控制,其中控制节拍节奏的函数都是“JS151_OS_Task_Sleep_MS(xxx)”。这个函数的名称是“任务休眠函数”,它的功能是通知RTOS系统本任务需要“休眠多少毫秒”,在休眠期间可以暂停本任务的执行,等待休眠到期,再唤醒本任务从下一行程序开始继续执行。
(16)通常对于没有RTOS的单任务程序,控制节奏节拍的是软件延迟函数,延时时软件做空循环等待。
对于RTOS系统,当一个任务进入休眠等待状态时,不需要再做无用的空循环,任务直接放弃CPU的执行权,让其他就绪的任务获得CPU的执行权去执行该任务。
这就是RTOS系统最基本的任务调度方法:高优先级的任务在休眠期间利用“休眠函数”主动放弃CPU执行权,让其他低优先级的任务得以继续执行
(17)当高优先级任务开始休眠时,如果同时有好几个低优先级任务处于就绪状态时,RTOS通常让这些就绪任务中优先级最高的一个获得CPU执行权,这种方法称为“按优先级”进行任务调度
(18)通常RTOS在每毫秒一次的系统节拍中断中处理休眠任务,系统把每个休眠任务的休眠毫秒时间减一,如果减到0,说明该任务的休眠已经到期了,就将其的任务状态设置为就绪状态
(19)每当有休眠任务到期,RTOS系统就将到期任务的优先级与当前正在执行的任务的优先级进行比较,如果到期任务的优先级比当前正在执行的任务的优先级还高,那么RTOS的调度系统就剥夺当前任务的CPU执行权,将CPU执行权交给休眠到期的任务,从休眠函数的下一行开始继续执行程序。
这种任务调度方式称为“抢占式任务调度”

附件1:STCIDE+金水151编译器
附件1_STCIDE-金水151_V22.rar (14.58 MB, 下载次数: 106)
附件2:RTOS独立任务范例程序
附件2_金山151_独立任务.rar (131.75 KB, 下载次数: 105)

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-9-16 07:59:20 | 显示全部楼层
虚拟机模型吗?

点评

虚拟机模型已经有特定的含义了,改叫虚拟机单片机模型更准确些  详情 回复 发表于 2024-9-16 09:11
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-9-16 09:11:03 | 显示全部楼层
so*** 发表于 2024-9-16 07:59
虚拟机模型吗?

虚拟机模型已经有特定的含义了,改叫虚拟机单片机模型更准确些
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 2024-10-2 11:29:59 | 显示全部楼层
抱歉没看懂。玫瑰一号是不是以8051U实验箱为核心的?比试验箱多了什么?

点评

“玫瑰派一号”虚拟开发板具有8个LED灯、一个8位数码管和连接在P30P31上的供烧录和通讯用的串口UART1。 是实验箱上包括了玫瑰一号的所有东西,是实验箱上多了很多玫瑰一号没有的东西。  详情 回复 发表于 2024-10-2 15:12
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-10-2 15:12:12 | 显示全部楼层
yzhk*** 发表于 2024-10-2 11:29
抱歉没看懂。玫瑰一号是不是以8051U实验箱为核心的?比试验箱多了什么?

“玫瑰派一号”虚拟开发板具有8个LED灯、一个8位数码管和连接在P30P31上的供烧录和通讯用的串口UART1

是实验箱上包括了玫瑰一号的所有东西,是实验箱上多了很多玫瑰一号没有的东西。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 2024-10-2 22:34:56 | 显示全部楼层
杨*** 发表于 2024-10-2 15:12
“玫瑰派一号”虚拟开发板具有8个LED灯、一个8位数码管和连接在P30P31上的供烧录和通讯用的串口UART1。

...

是不是这个虚拟开发板就这个8个led——8位数码管。还有烧录口。

因为没有mcu。所有叫虚拟开发板?

点评

(1)不是。这里“虚拟”的意思是从一个整体的很多组成部分中抽取一部分定义为一个抽象的整体,然后给这个抽象的整体取个名字。然后进行研究。 比如从一个4室两厅的大房子里抽出一间客房、一个厕所和厨房,然后这3  详情 回复 发表于 2024-10-3 11:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-10-3 11:49:29 | 显示全部楼层
本帖最后由 杨为民 于 2024-10-3 11:52 编辑
yzhk*** 发表于 2024-10-2 22:34
是不是这个虚拟开发板就这个8个led——8位数码管。还有烧录口。

因为没有mcu。所有叫虚拟开发板? ...

(1)不是。这里“虚拟”的意思是从一个整体的很多组成部分中抽取一部分定义为一个抽象的整体,然后给这个抽象的整体取个名字。然后进行研究。

比如从一个4室两厅的大房子里抽出一间客房、一个厕所和厨房,然后这3个部分就是一个虚拟的“宅男天堂”样板间。
然后我们就可以开展研究、教学和学习:宅男的厕所一定要有淋浴和放手机的支架;宅男的厨房的灶台不用很大,但是冰箱要够大,然后还要有一张桌子吃饭;宅男的房间必须要有足够大的床放脏衣服,桌子要够放两个显示屏,等等。
(2)庖丁宰牛的故事告诉我们把整体分成若干部分是一种很好的研究、教学和学习方法。AI8051U实验箱是一个很复杂的和多功能的实验箱,因此我们可以在上面“虚拟”出很多块“实验板”来进行学习,这是一种最好的学习方法。
比如:
1)玫瑰派一号开发板:用于基础性学习研究
2)ADC采集开发板(包括NTC和数码管):用于学习ADC采样原理和编程、采样数据定标和数字显示等等
3)数字温度时钟开发板(包括DS18B20、RTC、OLED显示屏):用于学习 单总线、IIC总线和SPI总线等等
4)数字示波器开发板(包括探头和模拟放大电路、TFT显示屏等):用于学习模拟信号处理,高速AD变换、数字绘图等等
等等等等
(3)玫瑰派一号是学习单片机最基础的开发板,几乎所以的开发板和实验箱都会包含这个虚拟的开发板,比如STC所有的实验箱都包含这个部分。
(4)下面是我使用的非虚拟的真实的“玫瑰派一号”开发板:
玫瑰派开发板_01_小样.jpg

这块开发板连接了逻辑分析仪,用于测量各种时序信号。
玫瑰派开发板_02_小样.jpg

这块用于通常的C351语言和汇编语言和RTOS的开发研究。
玫瑰派开发板_03_小样.jpg

这块连接了NRF24L01,用于开发研究无线通讯程序用
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 2024-10-3 22:47:05 | 显示全部楼层
杨*** 发表于 2024-10-3 11:49
(1)不是。这里“虚拟”的意思是从一个整体的很多组成部分中抽取一部分定义为一个抽象的整体,然后给这个 ...

您这个不错。要是出个视频详细介绍下接线就好了。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-1 19:24 , Processed in 0.135823 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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