找回密码
 立即注册
楼主: YangHY

第一课 序言《AI8051U的特点》

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 11:33:15 | 显示全部楼层
按键按一下,LED移动一下,都是正常运行的

截图202512221133138803.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 11:40:01 | 显示全部楼层
以上就是我们定时器任务调度的功能

当然没有操作系统哪么厉害,但也有点意思

不管哪一个任务在执行,一个串口打印任务,另一个是一个按键切换任务

这个是LED灯指示的任务,他们这三个任务都是相互独立的,他们不会相互影响

他们都是能独立运行。不会相互影响!!!

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 11:41:00 | 显示全部楼层
下面看文件的创建:

文件的创建(c和.h)
创建程序文件三步,把硬件需要的初始化弄一个config.c新建文件并保存.
添加到工程
添加引用路径


一般一个.c和一个1文件执行一个外设或者一个任务或功能,这样可以让代
看上去清爽,简洁明了

截图202512221142465056.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 11:45:33 | 显示全部楼层
看上去要配对:


过程不好记录,憨憨的跟着冲哥走就OK!
截图202512221145315075.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 13:21:03 | 显示全部楼层
接下来是今天的最重要的部分:

结构体数组的周期性任务调度
A LED1 Q:3秒闪一次;LED2 0.6秒闪一次,LED3 0.9秒闪一次1都有定时器1'ms加的变量,
2都有一个设定的计数目标,
3都有需要执行的功能,
4.定时时间到了才能执行

截图202512221321005273.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 13:23:04 | 显示全部楼层
重点看结构体:

截图202512221322526325.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 13:27:56 | 显示全部楼层
这个结构体,可以先看成有固定格式的数组:

截图202512221327536382.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 13:31:25 | 显示全部楼层
先看这个结构体:

先在*.h里定义:


typedef struct
{
        u8 Run;               //任务状态:Run/Stop
        u16 TIMCount;         //定时计数器
        u16 TRITime;          //重载计数器
        void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;   // 这里TASK_COMPONENTS是我们定义的结构体的名字

static 是[color=var(--color-li-default)]局部静态变量[color=var(--color-text-default) !important]:通常定义在函数内部。与普通局部变量不同,它在函数调用
  • [color=var(--color-text-default) !important]结束后不会被销毁[color=var(--color-text-default) !important],其值会保持不变,直到下一次函数调用。它只在该函数
  • [color=var(--color-text-default) !important]内可见。



然后在.c里调用
static TASK_COMPONENTS Task_Comps[]=      //定义局部静态结构体变量Task_Comps[]
{
//状态  计数  周期  函数
        
{0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
{0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
{0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */  
{0, 10,    10,    KEY_Task},      /* task 1 Period: 600ms */         
};



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 16:50:08 | 显示全部楼层
STC官方例程:

27-通过定时器周期性调度任务综合例程,简单实用的任务调度系统,推荐

是个非常典型的周期性调度任务,务必花时间搞懂!

u8 Tasks_Max = sizeof (Task_Comps)/sizeof (Task_Comps[0]): //这里算出有多少个任务


//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps[i].Run) /* If task can be run */
        {
            Task_Comps[i].Run = 0;      /* Flag clear 0 */
            Task_Comps[i].TaskHook();   /* Run task */
        }
    }
}

这意思是只要Task_Comps[i].Run=1,就先把它清零,然后执行对应的函数
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2026-03-03 08:35:54
已绑定手机

5

主题

1092

回帖

1374

积分

金牌会员

积分
1374
发表于 2025-12-22 16:59:07 | 显示全部楼层
那下面这个函数是干涉么?

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps.TIMCount)      /* If the time is not 0 */
        {
            Task_Comps.TIMCount--;   /* Time counter decrement */
            if(Task_Comps.TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;  
                Task_Comps.Run = 1;      /* The task can be run */
            }
        }
    }
}


看看我加的注释:


u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);//算出有几行(几个任务)

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps.TIMCount)      // If the time is not 0假如不为0
        {
            Task_Comps.TIMCount--;   // Time counter decrement 计数变量--
            if(Task_Comps.TIMCount == 0) // If time arrives 假如计数变量为0
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime; //d对应变量重新装载初值
                Task_Comps.Run = 1;      //The task can be run Run标志位置1
            }
        }
    }
}


回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-2 16:58 , Processed in 0.112873 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表