一、设计需求
设单片机的时钟12MHz,型号为AT89S52。单片机引脚连接有4个LED,其中:
- LED1以30Hz的固定频率闪烁;
- LED2在外部中断发生以后,亮0.2秒,然后熄灭;
- LED3在LED2熄灭以后以20Hz的频率闪烁10次然后熄灭;
- *将LED的亮灭情况实时通过串口输出;
二、题目分析
题目中4个LED需要“同时”执行不同的操作,如果使用常规的方式来构建,是有一些难度的;而如果用RTX51 tiny,实现起来将比较简单。我们只需要构建不同的task,每一个task都相当于在单独执行,但是宏观上看起来多个任务是在 “同时”执行的,根据题目要求,除了简单的创建task,我们还需要用到task之间的信号传递。对于rtos的理解有点类似于数码管,快速依次去点亮每一位数码管,这显然是串行的操作,但是看起来这几位数码管是同时亮起来的,又像是在并行工作。
三、模块分析
3.1 点亮LED1
题目要求LED1以30Hz的固定频率闪烁,经过计算可知LED1的电平状态需要33ms翻转一次。创建一个task,在这个task里每延时33ms让LED1电平翻转一次即可。
关于RTOS的延时,系统中给了os_wait2( )函数,这个函数有两个输入参数,详细可以看帮助文档。这里需要注意一个tick代表多长时间,这个可以在Conf_tny.51文件中查看,通过INT_CLOCK的值来计算,默认值为10000,如果使用12M的晶振,那么这里就是10ms,也就是说如果我们写了os_wait2( K_TMO,1),就表示延时10ms。我们发现这里最小的延时单位只能是10ms。可以更改INT_CLOCK的值来减小延时单位长度。这里将INT_CLOCK的值改为1000,一个延时单位就是1ms。需要注意,os_wait2( )中的参数类型是unsigned char,意味着我们最大只能写255,如果需要更长的延时,可以通过for循环来构建。