再次编译连接:
按键按下也是正常反应的,问题解决了
就是说,串口打印任务和按键切换任务,亮灯移位任务,
都要符号任务调度要求,3个相互独立的任务,不能互相影响
仔细观察,3个任务都有人干活的
下面学一个非常重要的内容:
一般一个.c和一个出文件执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了
这样我们首先分文件夹,再分文件
把项目搞的很清爽,查找模块就很方便
一个.c对应一个.h
,h文件是这样的格式:
#ifndef__CONFIG_H
#define__CONFIG_H
#endif
一般一个.c和一个:h文件执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了
上面的描述,听起来很简单,实际上是要很细心的,我们STC的很多例子程序都是一个文件,当你想
改写成多文件的时候,要规划好,一个外设(至少是一类)外设一个.c+一个.h文件,一般都是这样配对的
我们先创建一个config.c文件
#include "config.h"
void Sys_init(void)// 系统初始化
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
}
void Delay10ms(void) //@24.000MHz,延时10ms
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 59998UL;
while (i) i--;
}
接着继续创建和它配套的config.h文件:
#ifndef __CONFIG_H
#define __CONFIG_H
#include ".\ai8051u.h" //调用头文件
#include ".\stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //调用头文件
#include "io.h" //调用头文件
#include "task.h" //调用头文件
#define u8unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
void Sys_init(void);// 系统初始化函数声明
void Delay10ms(void); //@24.000MHz,延时10ms函数声明
#endif
把所有要调用的.h文件都写在config.h里,主函数调用一次config.h就全都有了
还有以后定时器0的1ms的初始化函数,讲作为标志配置
直接把它放在config.c里:
#include "config.h"
void Sys_init(void)// 系统初始化
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
//TM0PS = 0x00; //设置定时器时钟预分频
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Delay10ms(void) //@24.000MHz,延时10ms
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 59998UL;
while (i) i--;
}
接下来是今天最难,也是今后最重要的内容
结构体周期性任务调度
对应4句中文,我们想先定义一个大类:
typedef struct
{
u8 Run;//任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime;//重载计数器
void(*TaskHook)void);//任务函数
}.TASK_COMPONENTS;
这是个固定的搭配
下面参考STC的试验箱例子程序27,来改写: