在程序设计中如何定义信号量变量(信号量前后台任务之间的桥)
在程序设计中如何定义信号量变量(信号量前后台任务之间的桥)视频中上方的数码管由4Hz的定时任务进行系统时间实时显示,下面的串口助手用做命令行的输入输出。 首先串口命令输入必须是依托中断进行接收的前台程序,不能是无限循环查询是否接收到命令的后台程序。其次这种让车辆逐渐靠边停止的控制程序是需要连续占用CPU一段时间来处理的,这种程序不能放在前台任务中执行,只能是后台任务程序。(3)解决这种需要实时响应,又需要一定处理时间的问题的方法在前后台多任务操作系统中一般是定义一个“信号量”,当事件发生时,在实时响应的前台任务中设置这个信号量为“真”后,前台任务就退出,不会产生阻塞问题。在后台任务中,在主循环中不断地检测这个信号量,当信号量为真时在后台启动处理程序进行处理。由于处理程序是在后台任务中运行,不受时间长短的限制。本文范例重点介绍泰山x51的后台多任务和利用信号量来实现控制台命令行输入输出处理的编程方法。下面的视频显示了本范例的运行效果。
玫瑰派(Rose Pi)的标准系统配置为32位的STC32G12K128单片机,也可以配40脚的STC8H8K64U单片机(45MHz主频,8KB SRAM 64KB FLASH)。STC8H8K64是一款优秀的8051架构单片机,并且与STC32G有很好的互换性,大部分应用程序只需要换个头文件,再重新编译就可以了。本文以采用STC8H单片机的玫瑰派位硬件平台。
(1)单片机后台任务指“main”函数中的主循环部分。后台任务一般分为实现不同功能的多个部分,每一部分有时也称为一个“后台任务”——按功能区分的任务,这样的程序称为后台多任务程序。后台任务的特点是每个任务的执行不受限制,直到完成任务的功能为止。
单片机硬件中断执行的中断服务程序称为前台任务,每一个中断是一个前台任务,所以单片机程序肯定是前台多任务程序。前台任务的特点是有实时响应的能力,但必须在有限的时间内完成中断处理,否则如果优先级高的中断迟迟不退出,优先级低的中断就会被阻塞那里,直到优先级高的中断退出后才能产生。
(2)实现单片机通过串口接收命令行,然后对命令进行解析和处理的功能的程序同时涉及到前台和后台任务,比如接收到命令后,单片机让高速运动的车辆逐渐靠边停止。
首先串口命令输入必须是依托中断进行接收的前台程序,不能是无限循环查询是否接收到命令的后台程序。其次这种让车辆逐渐靠边停止的控制程序是需要连续占用CPU一段时间来处理的,这种程序不能放在前台任务中执行,只能是后台任务程序。
(3)解决这种需要实时响应,又需要一定处理时间的问题的方法在前后台多任务操作系统中一般是定义一个“信号量”,当事件发生时,在实时响应的前台任务中设置这个信号量为“真”后,前台任务就退出,不会产生阻塞问题。在后台任务中,在主循环中不断地检测这个信号量,当信号量为真时在后台启动处理程序进行处理。由于处理程序是在后台任务中运行,不受时间长短的限制。
本文范例重点介绍泰山x51的后台多任务和利用信号量来实现控制台命令行输入输出处理的编程方法。下面的视频显示了本范例的运行效果。
视频中上方的数码管由4Hz的定时任务进行系统时间实时显示,下面的串口助手用做命令行的输入输出。
按照程序,当接收到一行命令后,就将其原样从串口输出,如果5秒钟没有收到命令行,就向串口发送超时警告信息,从视频中可以看到这个过程。
视频中还显示了以1毫秒的间隔自动发送命令时系统的响应,没有丢数据的情况。
(4)控制台命令行处理任务。后台多任务循环包括4个子任务,第一个控制台输入命令任务程序见下图:
本范例收到命令行字符串输入的信号量是“RX_Flag”,收到命令行后将 “RX_Flag”置1,由后台任务来处理。
每个后台任务主循环开始,第77行检测信号量,如果收到命令,就执行第79行到第94行的处理程序。首先第79行将系统缓冲区中的数据复制到任务缓冲区“TX_Buf”中,然后在进行命令处理前,第81行清除信号量,第83行让中断服务程序在前台开始接收新命令,由后台来处理命令。本范例的第86行第88行模拟命令处理。
执行完命令处理程序后,第96行程序直接转移到循环开始处,立即检测有没有新的命令进来。
这种每执行一个后台任务,不继续执行下一个后台任务,而是转到主循环开始处的后台程序结构,本质是将后台任务按次序划分了优先级,每次循环按优先级次序检测任务,有就绪的后台任务就立即执行。
经第77行的检测,如果没有收到命令,上图第99行程序将超时计数加1。
(5)其他后台任务程序,见下图:
后台任务2是超时警告任务,第103行程序检测超时计数,达到超过5000次就执行该任务。由于第132行的空闲任务是延时1毫秒,所以5000个延时计数大致是延时5秒钟。
图中第123行到第128行是一个LED交替闪烁的任务,其中“Tick4”是计数变量,每250个计数清零,同时翻转LED6的电平。
(6)第139到148行的程序“TSx51_SYS_UART1_RX_NewLine_Hook()”是串口1接收到完整的命令行后回调的钩子函数。从中可以看到在第146行设置信号量为1,供后台任务启动命令行处理程序用。