打印
[产品应用]

深入探究单片机的性能:一文说透了如何实现单片机的多任务并发!

[复制链接]
1238|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2023-5-16 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式系统开发中,多任务并发是非常常见的,对于处理复杂的应用场景、提升系统的并发能力、提高系统的实时性等方面都有很大好处。在单片机中实现多任务并发是非常重要的,本文将为大家介绍如何在单片机中实现多任务并发。
一、任务调度
任务调度是多任务并发中一个非常重要的概念。它指的是如何在系统中组织和规划多个任务的顺序和时间。任务调度的目的是使多个任务在实际执行中,按照一定的顺序和时序,充分利用 CPU 资源,并且避免出现资源争抢和堵塞的情况。
在单片机多任务并发中,常见的任务调度方式有两种:
1. 时间片轮转法
时间片轮转法是多任务并发中最基本的调度算法之一,它的核心思想是轮流分配 CPU 时间片,每个任务仅在分配到 CPU 时间片时才能执行。时间片轮转法可以保证所有任务都有机会被执行,是一种非常公平的调度算法。
2. 优先级调度法
优先级调度法是多任务并发中另一种非常常见的调度算法,它的核心思想是根据任务的优先级,按照优先级的高低顺序调度任务。如果系统中多个任务具有相同的优先级,则系统采用时间片轮转法进行调度。优先级调度法可以确保高优先级的任务优先被执行,从而提高系统的实时性。

使用特权

评论回复
沙发
elephant00|  楼主 | 2023-5-16 14:32 | 只看该作者
二、任务间通信
在多任务并发中,不同任务之间需要进行通信,以便协调任务间的资源分配和控制。任务间通信的方式主要有以下几种:
1. 全局变量
全局变量是多个任务共享的变量,可以用于任务间的数据传输。但是,多个任务同时访问同一个全局变量可能出现竞争问题,需要采用信号量或者互斥量等机制来避免冲突。
2. 消息队列
消息队列是指存放消息的队列,每个消息都是一个对象,由发送任务产生,并由接收任务接收和处理。消息队列可以实现异步通信,提高系统效率。
3. 信号量
信号量是一种同步机制,用于任务间的资源分配和控制。信号量通常只有两个值:0 和 1。当任务需要使用某个共享资源时,首先判断信号量的值是否为 0,如果为 0,则等待;如果为 1,则表示可以使用该资源,请求资源后将信号量值减 1,表示资源已被占用。
三、实例分析
下面以基于 STM32 单片机的多任务并发实例为例,讲解如何实现多任务并发。
1. 任务定义
在该实例中,我们定义了两个任务:
任务 1:实时采集温度数据,每隔 1 秒钟发送一次采集结果到串口。
任务 2:接收串口的命令并进行解析处理。
2. 任务调度
我们采用优先级调度法来调度这两个任务。由于任务 2 的优先级较高,因此任务 2 会先被调度执行。待任务 2 执行完毕后,才会调度任务 1。
3. 任务间通信
任务 1 通过全局变量来进行任务间通信,它将采集得到的温度数据存储在一个全局变量中,并在任务调度之后将采集结果发送到任务 2 中。任务 2 通过串口接收命令,并将其存储在一个全局变量中。如果接收到的命令为 “get_temp”,则读取任务 1 中存储的温度数据并将其发送回去。

使用特权

评论回复
板凳
elephant00|  楼主 | 2023-5-16 14:32 | 只看该作者
4. 实现代码
任务 1 的实现:
```
void task1(void)
{
    for (;;)
    {
        uint16_t temp = read_temperature();   // 采集温度数据
        g_temp_data = temp;                   // 存储温度数据到全局变量
        send_temperature(temp);               // 向串口发送温度数据
        osDelay(1000);                        // 暂停 1 秒钟
    }
}
```
任务 2 的实现:
```
void task2(void)
{
    for (;;)
    {
        if (g_cmd_received == 1)               // 判断是否接收到命令
        {
            if (strcmp(g_cmd, "get_temp") == 0)   // 判断是否为 “get_temp” 命令
            {
                send_temperature(g_temp_data);     // 向串口发送温度数据
            }
            g_cmd_received = 0;                 // 清除命令接收标志位
        }
        osDelay(10);                            // 暂停 10 毫秒
    }
}
```
四、总结
多任务并发是单片机开发必不可少的一个技能点,它可以提高系统性能和实时性,同时也需要我们对任务调度、任务间通信等方面有深入的理解。

使用特权

评论回复
地板
daichaodai| | 2023-5-16 20:03 | 只看该作者
实际并不是多任务并发

使用特权

评论回复
5
八层楼| | 2023-6-9 16:45 | 只看该作者
感觉无论是单片机还是pc机,他们的多任务并发的本质都是一样的

使用特权

评论回复
6
观海| | 2023-6-9 17:06 | 只看该作者
多任务处理:同一个时间内计算机系统中如果允许多个进程同时处于运行状态,这便是多任务

使用特权

评论回复
7
tpgf| | 2023-6-9 17:23 | 只看该作者
只有一个CPU的计算机,操作系统可以进行多进程并发执行,实现多任务处理

使用特权

评论回复
8
guanjiaer| | 2023-6-10 10:08 | 只看该作者
并发:指的是任务数多于cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)。

使用特权

评论回复
9
heimaojingzhang| | 2023-6-10 10:28 | 只看该作者
单核CPU就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。

使用特权

评论回复
10
keaibukelian| | 2023-6-10 10:49 | 只看该作者
真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行

使用特权

评论回复
11
OKAKAKO| | 2023-6-11 21:56 | 只看该作者
guanjiaer 发表于 2023-6-10 10:08
并发:指的是任务数多于cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总 ...

楼主正解,其实如果是单片机一般是顺序执行,很短的时间段去执行相关的任务,调度处理的多任务并发

使用特权

评论回复
12
szt1993| | 2023-6-13 15:01 | 只看该作者
就是说在极短极短的时间上做的顺序处理

使用特权

评论回复
13
lulugo| | 2023-6-13 15:56 | 只看该作者
安富莱电子的H7-TOOL开发工具可以仿真烧录芯源的单片机 ,

使用特权

评论回复
14
caigang13| | 2023-7-7 08:05 | 只看该作者
这不是真正的并发

使用特权

评论回复
15
szt1993| | 2023-7-11 22:10 | 只看该作者
实际的单片机多任务并发其实是时间片上进行的相关操作

使用特权

评论回复
16
软核硬核| | 2023-8-3 11:18 | 只看该作者
用于,如:SWD复位接口、单片机电源、单片机引脚等

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

968

主题

2962

帖子

7

粉丝