• 51系列小型操作系统精髓 简单实现6 C语言版待改进


    #include "STC12C5A.H"


    #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms


    #define MAX_TASKS 8 //任务槽最大个数.
    unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节。
    unsigned char idata task_time[MAX_TASKS]; //定时时间
    unsigned char task_id=0; //当前活动任务号


    void rtos_wait(unsigned char time)
    {


    //保存当前任务时间
    task_time[task_id]=time;


    //保存当前断点 并把SP=SP-2,任务切换到下一任务;
    task_stack[task_id][1] =*((unsigned char *)(SP));
    SP--;
    task_stack[task_id][0] =*((unsigned char *)(SP));
    SP--;



    //任务号
    if(++task_id == MAX_TASKS)
    task_id = 0;
    }
    unsigned char a=0;
    unsigned char b=0;
    void task_test()
    {
    while(1)
    {
    a++;
    rtos_wait(100); //运行完后,记录下一步地址,返回
    a++;


    }
    }
    void task_test2()
    {
    while(1)
    {
    b++;
    rtos_wait(10); //运行完后,记录下一步地址,返回
    b++;
    }
    }
    void Timer0Init() //@18.432MHz
    {
    AUXR &= 0x7F; //定时器时钟12T模式
    TMOD &= 0xF0; //设置定时器模式
    TMOD |= 0x01; //设置定时器模式
    TL0 = 0x00; //设置定时初值
    TH0 =0xC4; //设置定时初值 10ms
    TF0 = 0; //清除TF0标志
    TR0 = 1; //定时器0開始计时


    ET0=1;
    EA=1;
    }
    void main()
    {
    Timer0Init();
    task_test();
    task_test2();
    while(1);
    }
    void rwcl() //任务时间是否到,任务时间到 实时切换回
    {
    //从把定时时间减1 ,找看哪个任务到 ,任务时间到 实时切换回
    unsigned char i;
    for(i=0;i<MAX_TASKS;i++)
    {
    if(task_time[i])
    {
    task_time[i]--;
    if(task_time[i]==0)
    SP=task_stack[i]+1;
    }
    }
    }
    void tm0_isr() interrupt 1 using 1
    {
      //定时时间重载
    TIMER_RELOAD();


    rwcl(); //任务时间是否到,任务时间到 实时切换回
    }
  • 相关阅读:
    Android开发进度07
    wifidog认证实现OpenWRT强制认证的WIFI热点
    wifidog配置分析
    wifidog源码
    Wifidog分析wifidog认证网关协议v1
    Wifidog认证稳定性测试方法及说明
    X86 DD-WRT WifiDog 配置详解
    wifidog无线认证RADIUS 配置指南
    wifidog配置DD-WRT中使用 RADIUS 对无线网络认证
    wifidog如何判断用户不在线?
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4342568.html
Copyright © 2020-2023  润新知