首页 > 其他分享 >CH32--裸机系统实现多任务

CH32--裸机系统实现多任务

时间:2023-06-12 20:37:22浏览次数:38  
标签:Delay Task CH32 -- void 裸机 while SysTick

在ram和flash资源足够的芯片中,我们通常通过跑操作系统来实现多任务,但此方法有个弊端,那就是对ram要求高,那么对于比如003这种只有2K  ram的小容量芯片可能就不太够用了。

这时就需要裸机来实现多任务了,方法如下:

在裸机中,通常都是在一个 while 循环中,通过判断相应的标志位,来按照顺序执行相应的代码。为了加快响应速度,

较为常见的做法是中断中修改标志位,代码中判断标志位,如下:

int main(void)
{
  XX_Init();

  /* while 中判断标志位 */
  while (1)
  {
    if (flag1 == 1)
    {
      code1;
      flag1 = 0;
    }

    if (flag2 == 1)
    {
      code2;
      flag2 = 0;
    }

    /************/
  }
}

/* 中断服务函数中修改标志位 */
void interrupt1(void)
{
  flag1 = 1;
}

void interrupt2void)
{
  flag2 = 1;
}

 上述处理在裸机系统中比较常用,也足以实现很多的功能。但一种更为高级的处理方式,就是利用 SysTick 来实现类似于实时操作系统的调度,来看一下是怎么实现的:

注:此例程以203为例,要改为003的只需要注意下003与203不同的是systic是32位的,203是64位的

1.定义任务数量,以及任务时基

#define NumOfTask     2
unsigned int Task_Delay[NumOfTask]={ 0 };

2.systic的初始化

static uint32_t SysTick_Config(uint32_t ticks)
{
    SysTick->CTLR = 0x00000000;             //控制寄存器复位

    SysTick->SR = 0x00000000;               //状态寄存器复位

    SysTick->CNT = 0x00000000;              //计数器复位,设置初始值为0

    SysTick->CMP = ticks;                   //给重加载寄存器赋值

    NVIC_SetPriority(SysTicK_IRQn, 15);     //设置SysTick中断优先级

    NVIC_EnableIRQ(SysTicK_IRQn);           //使能开启Systick中断

    SysTick->CTLR |= 0x0000000B;            //启动系统计数器STK(HCLK/8时基),向上计数到比较值后重新从 0 开始计数

    return (0);
}

void Systick_Init(void)
{
    //此处在进行初始化的时候设置比较寄存器的值
    SysTick_Config(SystemCoreClock / 8000);//1ms            72M/8000/9000000 = 1/1000 = 1ms
}

void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void SysTick_Handler(void)
{
    SysTick->SR  = 0;//清标志
    unsigned char i;
      for (i = 0; i < NumOfTask; i++)
      {
        if (Task_Delay[i])
        {
          Task_Delay[i]--;
        }
      }


}

3.while(1)中的任务处理(想要更多任务参考下面格式来即可)

while (1)
      {
        if (Task_Delay[0] == 0)
        {
          /* 任务 0 主体 */
            printf("test_0\r\n");
          /* 任务 0 延时 1000ms */
          Task_Delay[0] = 1000;
        }

        if (Task_Delay[1] == 0)
        {
          /* 任务 1 主体 */
            printf("test_1\r\n");
          /* 任务 1 延时 500ms */
          Task_Delay[1] = 500;
        }

      }

 

标签:Delay,Task,CH32,--,void,裸机,while,SysTick
From: https://www.cnblogs.com/wchmcu/p/17476011.html

相关文章

  • 未来已来,音视频江湖再起波澜
    从通信为王的时代,到互联网高歌猛进的二十一世纪,音视频技术一直是众多科技公司的必备技能。一部手机联通全球各地,一个社交账号互动各国友人,已经不是什么新鲜事;就连超低延迟,超高清画质,沉浸式互动的元宇宙和全真互联,都在快速发酵,似乎马上就要被底层的摩尔定律催化过期。新鲜的应用容易......
  • LiveVideoStack年终技术盘点总结
    年终盘点#009#在2021年底,LiveVideoStack策划了一次年终技术盘点,我们向音视频领域的一线技术工作者们发出了约稿邀请,希望他们能够输出一些音视频方向的技术内容。众所周知,年底正是技术人最忙碌的时刻,要写各种总结报告,还要做明年的规划,所以我们并没有对这次约稿抱有很高的期待。但是......
  • 对话王晶:音频人才亟待培养,高水平研究人员尤其欠缺
    年终访谈#007#编者按:春节前夕的最后一次采访,LiveVideoStack有幸邀请到了北京理工大学信息与电子学院副教授王晶。王教授目前在北京理工大学信息与电子学院通信技术研究所从事教学科研工作,讲授本科生《数字通信网》和研究生《语音信号数字处理(全英文)》课程。在教学的同时,王教授还承......
  • HDR技术趋势浅析
    HDR年终盘点#008#1.HDR视频技术简介1.1 HDR技术概述在5G+AI的大时代背景下,超高清(UHD)视频将取得更快的发展,不单是在传统的广播电视领域,而且在互联网视频、OTT领域也会有越来越多应用上线。超高清视频不仅在分辨率、帧率上有提升,更重要的是体现在高动态范围(HDR)和宽色域(WCG)上。与传......
  • 2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为
    2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。现在,给定两个正整数L和R(以字符串形式表示),返回包含在范围[L,R]中的超级回文数的数目。输入:L="4",R="1000"。输出:4。答案2023-06-12:该算法的基本思路是从较小的回文数开始......
  • 文心一言 VS 讯飞星火 VS chatgpt (39)-- 算法导论5.4 3题
    三、在生日悖论的分析中,要求各人生日彼此独立是否很重要?或者,是否只要两两成对独立就足够了?证明你的答案。文心一言:在生日悖论的分析中,要求各人生日彼此独立是非常重要的。这是因为,如果各人生日不是独立的,而是存在一定的相关性,那么就会影响到概率的计算,从而影响到生日悖论的分析结......
  • linux 增加tc命令
    tc命令是iproute2包中的一个工具,可以用了模拟网络延时、抖动、丢包等操作,有些设备上没有tc命令,需要手动增加。下面以zynqMPlinux5.4为例说明tc命令的移植过程一、tc命令交叉编译1、下载iproute2包源码:gitclonehttps://github.com/shemminger/iproute22、解压源......
  • goland提示GOROOT is not defined
    场景,今天在新电脑使用goland,打开goland,没有加载GOROOT1.先检查GOROOT和GOPATH等配置是否已经加到系统环境变量中,如果没有加,那么就加一下2.跟着Goland提示进入到配置项中,选择goland安装目录又提示TheselecteddirectoryisnotavalidhomeforGoSdk那么接下来就需要改一......
  • 12种提升视频质量的方法
    影音探索#005#对于任何希望扩大其在线业务并提高知名度的公司来说,直播质量都非常重要。随着科技世界不断发展,视频直播已经成为连接潜在客户的重要元素。为了满足这种需求,各大企业需要配备适合需求的装置,并能够向用户提供无中断和无延迟的视频内容。本篇文章将会讨论确保直播视频质......
  • Python基础之os模块
    OS模块os.makedirs('dirname1/dirname2')可生成多层递归目录os.removedirs('dirname1')若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname')生成单级目录;相当于shell中mkdirdirnameos.rmdir('dirname')删除单级空目录,若目录不为......