第八节定时器周期性任务调度
ISP软件中
串口更多设置
数据分包显示
显示分包数据的收发时间
这节课的代码多,而且实现的任务比较多。
单片机型号错误 可以手动选择AI8051u-34K64, 或自动检测。
多任务,
任务调度系统,定时器驱动的所以时间会特别的准
周期性的多任务
手打实现三个任务,然后又讲了config.c config.h文件的固定格式,最后引入的任务调度系统,这个任务调度系统和前面三个任务实现的功能是基本一样的但是代码得到了精简和优化。这个任务调度系统模版更容易后期的维护,系统结构更加清晰,便于分层设计、利于系统抽象。
- 周期性任务介绍
- 任务1:用定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次
-
- 通过一个变量计数,假设这个变量1ms自加一次,加到300即为300ms加到600就是600ms,计数到达后从新清0
-
- u8 State1 = 0; //LED1初始状态
- u8 State2 = 0; //LED2初始状态
- u8 State3 = 0; //LED3初始状态
-
- u16 Count_ms[3] = {0,0,0}; //三个计时变量
-
- u8 State[10] = {1,2,3,4,5,6,7,8,9,10};
-
- u8 i;
- //u16 Count_300 = 0; //计数300ms变量
- //u16 Count_600 = 0; //计数600ms变量
- //u16 Count_900 = 0; //计数900ms变量
-
- void Timer0_Isr(void) interrupt 1 //1ms执行一次
- {
- // u8 i = 0;
- for( i=0; i<3; i++)
- {
- Count_ms[i] ++;
-
- if( Count_ms[0] >= 300)
- {
- Count_ms[0] = 0;
- State1 = !State1;
- P00 = State1;
- }
- }
- // Count_300++;
- // Count_600++;
- // Count_900++;
- // state = !state;
-
- // P00 = state;
- // P01 = !state
- }
-
-
- int main()
- {
- while(1)
- {
- if (bUsbOutReady) //如果接收到了数据
- {
- for( i=0; i<3; i++)
- {
- printf("当前i的数\xfd值:%d\r\n", (int)i);
- }
- // printf("State的第一个数\xfd据为:%d\r\n", (int)State[0]);
- // State[0] = 2;
- // printf("从新修改后的State的第一个数\xfd据为: %d\r\n", (int)State[0]);
- usb_OUT_done();
- }
-
- // if (Count_300 >= 300 ) //300ms到达
- // {
- // Count_300 = 0;
- // State1 = !State1; //LED1取反
- // P00 = State1;
- // }
- // if (Count_600 >= 600 ) //600ms到达
- // {
- // Count_600 = 0;
- // State2 = !State2; //LED2取反
- // P01 = State2;
- // }
- // if (Count_900 >= 900 ) //900ms到达
- // {
- // Count_900 = 0;
- // State3 = !State3; //LED3取反
- // P02 = State3;
- // }
- }
- }
复制代码
- //任务2:数组点亮LED,实现流水灯
-
- 注意事项:
- LED是0点亮,1熄灭
- 数组长度需要把握好
- 流水灯移动的时间
-
- 注释办法/**/
- /*
- b0 b1 b7
- 低 高
- LED0 - LED7
- 0 1 1 1 1 1 1 1
- 1 0 1 1 1 1 1 1
- 1 1 0 1 1 1 1 1
- 1 1 1 0 1 1 1 1
- 1 1 1 1 0 1 1 1
- 1 1 1 1 1 0 1 1
- 1 1 1 1 1 1 0 1
- 1 1 1 1 1 1 1 0
- */
-
- u8 State[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
-
- u8 num = 0;
-
- int main()
- {
- while(1)
- {
- if (bUsbOutReady) //如果接收到了数据
- {
- //USB_SendData(UsbOutBufer, OutNumber); //发送数据缓冲区,长度(接收数据原样返回,用于测试)
- usb_OUT_done();
- }
-
- if ( Count_ms[0] >= 500 ) //500ms执行一次
- {
- Count_ms[0] = 0;
-
- P0 = ~State[ num ]; //num取值 0-7
- num ++;
- if ( num > 7) num = 0;
-
- }
- }
- }
-
-
- void Timer0_Isr(void) interrupt 1 //1ms执行一次
- {
- }
复制代码
config.h
config.c
结构体数组的周期性任务调度
LED1 0.3秒闪一次, LED2 0.6秒闪一次, LED3 0.9秒闪一次
1都有定时器1ms加的变量
2又有一个设定的计数目标
3都有需要执行的功能;
4定时时间到了才能执行
- typedef struct
- {
- u8 Run; //任务状态: Run/Stop
- u16 TIMCount; //定时计数器
- u16 TRITime; //重载计数器
- void (*TaskHook)(void); //任务函数
- } TASK_COMPONENTS;
-
- static TASK_COMPONENTS Task_Comps[] =
- {
- //状态 计数 周期 函数
- {0, 1, 1, 执行功能},
- {0, 10, 10, 执行功能},
- };
-
-
- int main()
- {
- while(1)
- {
- if (bUsbOutReady) //如果接收到了数据
- {
- //USB_SendData(UsbOutBufer, OutNumber); //发送数据缓冲区,长度(接收数据原样返回,用于测试)
- usb_OUT_done();
- }
-
- Task_Pro_Handler_Callback(); //执行功能函数
-
- if ( Count_ms[0] >= 500 ) //500ms执行一次
- {
- Count_ms[0] = 0;
-
- P0 = ~State[ num ]; //num取值 0-7
- num ++;
- if ( num > 7) num = 0;
-
- }
- }
- }
-
-
- void Timer0_Isr(void) interrupt 1 //1ms执行一次
- {
- Task_Marks_Handler_Callback(); //系统计时
- }
-
复制代码
|