0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32多线程 单片机如何实现多线程

如意 来源:百度百科、与非网、CSDN 作者:百度百科、与非网 2021-07-22 14:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

stm32多线程单片机如何实现多线程

STM 32系列是专门应用在高性能、低成本、低功耗的嵌入式应用设计的ARM Corte-M0,M0+,M3,M4和M7内核,是主流的嵌入式单片机之一。

多线程通常是指从计算机软件或硬件上实现多个线程并发执行的技术,多线程技术有利于提升计算机整体处理性能。

基于STM32单片机的多线程源代码实例1:

#include “Hal_Led/Hal_Led.h”

#include “Hal_delay/delay.h”

#include “Hal_Key/Hal_Key.h”

#include “ringbuffer.h”

#define APP_LED2_BLINK_EVENT 0x0001

#define HAL_LED1_BLINK_EVENT 0x0001

#define TASK_NO_TASK_RUNNING 0xFF

unsigned short Hal_ProcessEvent( unsigned char task_id, unsigned short events );

unsigned short App_ProcessEvent( unsigned char task_id, unsigned short events );

typedef unsigned short uint16;

typedef unsigned char uint8;

#define TASK_CNT 2 //定义线程的个数

//定义函数指针

typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short events );

//线程函数表

const pTaskEventHandlerFn tasksArr[] =

{

Hal_ProcessEvent,

App_ProcessEvent

};

const unsigned char tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[ 0] );

//uint16 *tasksEvents;

uint16 tasksEvents[TASK_CNT] = { 0}; //每个线程有16位位域空间用于设置事件

static uint8 activeTaskID = 0xFF; //当前任务ID,指示作用

#define SUCCESS 0x00

#define FAILURE 0x01

#define INVALID_TASK 0x02

uint8 osal_set_event( uint8 task_id, uint16 event_flag )

{

if ( task_id 《 tasksCnt )

{

tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)

return ( SUCCESS );

}

else

{

return ( INVALID_TASK );

}

}

/**

* @brief 程序入口

* @param none

* @return none

*/

int main( void)

{

unsigned short taskID = 0;

uint8 idx = 0;

SystemInit(); //系统时钟初始化

delayInit( 72); //滴答定时器初始化

Led_Init(); //LED初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

osal_set_event( 0, HAL_LED1_BLINK_EVENT);

osal_set_event( 1, APP_LED2_BLINK_EVENT);

while( 1)

{

do

{

if(tasksEvents[idx]) //轮训获知哪个线程有事件需要进行处理

{

break;

}

}

while (++idx 《 tasksCnt);

if (idx 《 tasksCnt)

{

uint16 events;

events = tasksEvents[idx];

tasksEvents[idx] = 0; // 清除事件数组中的事件

activeTaskID = idx;

events = (tasksArr[idx])( idx, events ); //调用线程函数

activeTaskID = TASK_NO_TASK_RUNNING;

tasksEvents[idx] |= events; // 添加未处理的事件到本线程的事件组中

}

delayMs( 1000);

}

}

/**

* @brief 应用层处理

* @param none

* @r

*/

unsigned short Hal_ProcessEvent( unsigned char task_id, unsigned short events )

{

if ( events & HAL_LED1_BLINK_EVENT )

{

Led_Reverse( 1);

return events ^ HAL_LED1_BLINK_EVENT; //清除事件

}

}

/**

* @brief 硬件控制线程

* @param none

* @r

*/

unsigned short App_ProcessEvent( unsigned char task_id, unsigned short events )

{

if ( events & APP_LED2_BLINK_EVENT )

{

Led_Reverse( 2);

return events ^ APP_LED2_BLINK_EVENT; //清除事件

}

基于STM32单片机的多线程源代码实例2:

public class SimpleThread {

//私有的静态成员内部类,实现了Runnable接口

private static class ThreadMessage implements Runnable{

public void run(){

String[] info = {“消息1”,“消息2”, “消息3”, “消息4”};

try {

for(int i=0;i《info.length;i++){

Thread.sleep(4000);

displayThreadMessage(info[i]);

}

} catch (InterruptedException e) {

displayThreadMessage(“不能正常工作”);

}

}

}

//显示消息,消息是当前线程的名字

static void displayThreadMessage(String message){

String threadName = Thread.currentThread().getName();

//格式化输出线程消息

System.out.format(“%s: %s%n”, threadName, message);

}

public static void main(String[] args) throws InterruptedException {

// 中断ThreadMessage线程之前延迟的毫秒数(默认是一分钟)

long delay =1000 * 60;

//如果有命令行参数,那么在命令行参数中给出推迟的时间

if(args.length》0){

try {

delay =Long.parseLong(args[0])*1000;

} catch (NumberFormatException e) {

System.err.println(“参数必须是整数”);

System.exit(1);

}

}

displayThreadMessage(“启动线程ThreadMessage.。。”);

long startTime = System.currentTimeMillis();

Thread t = new Thread(new ThreadMessage());

t.start();

displayThreadMessage(“等待线程ThreadMessage结速。。。”);

//循环直到ThreadMessage线程退出

while(t.isAlive()){

displayThreadMessage(“继续等待线程ThreadMessage.。。”);

//最多等待3秒钟ThreadMessage线程结速

t.join(3000);

//如果线程t运行的时间超过delay指定时间

if(((System.currentTimeMillis() - startTime) 》 delay) && t.isAlive()){

displayThreadMessage(“线程ThreadMessage运行时间太久了,不想等待!”);

t.interrupt();

t.join();

}

}

displayThreadMessage(“结束线程ThreadMessage!!!”);

}

}

基于STM32单片机的多线程源代码实例3:

#include “Hal_Led/Hal_Led.h”

#include “Hal_delay/delay.h”

#include “Hal_Key/Hal_Key.h”

#include “ringbuffer.h”

#define APP_LED2_BLINK_EVENT 0x0001

#define HAL_LED1_BLINK_EVENT 0x0001

#define TASK_NO_TASK_RUNNING 0xFF

unsigned short Hal_ProcessEvent( unsigned char task_id, unsigned short events );

unsigned short App_ProcessEvent( unsigned char task_id, unsigned short events );

typedef unsigned short uint16;

typedef unsigned char uint8;

#define TASK_CNT 2 // 定义线程的个数

// 定义函数指针

typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short events );

// 线程函数表

const pTaskEventHandlerFn tasksArr[] =

{

Hal_ProcessEvent,

App_ProcessEvent

};

const unsigned char tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );

//uint16 *tasksEvents;

uint16 tasksEvents[TASK_CNT] = {0}; // 每个线程有 16 位位域空间用于设置事件

staTIc uint8 acTIveTaskID = 0xFF; // 当前任务 ID,指示作用

#define SUCCESS 0x00

#define FAILURE 0x01

#define INVALID_TASK 0x02

uint8 osal_set_event( uint8 task_id, uint16 event_flag )

{

if ( task_id 《 tasksCnt )

{

tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)

return ( SUCCESS );

}

else

{

return ( INVALID_TASK );

}

}

/**

* @brief 程序入口

* @param none

* @return none

*/

int main(void)

{

unsigned short taskID = 0;

uint8 idx = 0;

SystemInit(); // 系统时钟初始化

delayInit(72); // 滴答定时器初始化

Led_Init(); //LED 初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

osal_set_event(0, HAL_LED1_BLINK_EVENT);

osal_set_event(1, APP_LED2_BLINK_EVENT);

while(1)

{

do

{

if(tasksEvents[idx]) // 轮训获知哪个线程有事件需要进行处理

{

break;

}

}

while (++idx 《 tasksCnt);

if (idx 《 tasksCnt)

{

uint16 events;

events = tasksEvents[idx];

tasksEvents[idx] = 0; // 清除事件数组中的事件

acTIveTaskID = idx;

events = (tasksArr[idx])( idx, events ); // 调用线程函数

activeTaskID = TASK_NO_TASK_RUNNING;

tasksEvents[idx] |= events; // 添加未处理的事件到本线程的事件组中

}

delayMs(1000);

}

}

/**

* @brief 应用层处理

* @param none

* @r

*/

unsigned short Hal_ProcessEvent( unsigned char task_id, unsigned short events )

{

if ( events & HAL_LED1_BLINK_EVENT )

{

Led_Reverse(1);

return events ^ HAL_LED1_BLINK_EVENT; // 清除事件

}

}

/**

* @brief 硬件控制线程

* @param none

* @r

*/

unsigned short App_ProcessEvent( unsigned char task_id, unsigned short events )

{

if ( events & APP_LED2_BLINK_EVENT )

{

Led_Reverse(2);

return events ^ APP_LED2_BLINK_EVENT; // 清除事件

以上是关于STM32单片机的源代码,希望对用户有所帮助。

本文整合自百度百科、与非网、CSDN-辣条boy

责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663480
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371134
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20913
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux多线程对比单线程的优势

    ,而单线程则需要通过进程间通信来实现。「上下文切换开销小」:线程的上下文切换比进程小,因为它们共享相同的地址空间。「提高响应性」:多线程可以使程序更加响应用户输入或其他事件,避免阻塞。
    发表于 12-01 06:11

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    【HZ-T536开发板免费体验】—— linux创建线程

    的执行任务成为单线程多线程是程序中包含多个执行流,在一个程序中可以同时运行多个不同的线程来执行不同的任务。 多线程提高了CPU的使用卤率。多线程
    发表于 09-01 21:31

    【RA4E2开发板评测】LED1及LED2轮流点亮并同时亮8秒,体验FreeRTOS多线程

    我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个
    发表于 08-24 17:24

    UVC+MSC实现中MSC线程未运行的原因?

    我正在尝试使用 EZUSB 运行 UVC + MSC。我有以下内容。但看起来只有 UVC 线程在运行,而 MSC 没有运行。fw 不响应 MSC 命令。我确保 LPM 已被禁用,只是为了检查传感器
    发表于 07-16 07:08

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    鸿蒙5开发宝藏案例分享---跨线程性能优化指南

    ;>Worker</span>做多线程开发时,总遇到对象跨线程卡顿的问题,原来鸿蒙早就提供了解决方案。下面结合代码和实战案例,带你彻底玩转性能优化! 一、痛点:跨线程
    发表于 06-12 17:13

    工控一体多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 486次阅读

    使用Percepio View免费跟踪工具分析Zephyr应用

    Percepio View免费跟踪工具现在可以针对Zephyr应用程序进行跟踪和可视化分析了。Percepio View可以帮助开发人员理解和调试Zephyr中的固定优先级的多线程行为及复杂的线程交互。
    的头像 发表于 05-27 15:08 583次阅读
    使用Percepio View免费跟踪工具分析Zephyr应用

    一种实时多线程VSLAM框架vS-Graphs介绍

    针对现有VSLAM系统语义表达不足、地图可解释性差的问题,本文提出vS-Graphs,一种实时多线程VSLAM框架。该方案显著提升了重建地图的语义丰富度、可解释性及定位精度。实验表明
    的头像 发表于 04-19 14:07 721次阅读
    一种实时<b class='flag-5'>多线程</b>VSLAM框架vS-Graphs介绍

    STM32F103x8 STM32F103xB单片机数据手册

    STM32F103x8STM32F103xB单片机数据手册
    发表于 04-14 14:55 6次下载

    进程、线程、协程傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    外卖员(线程C):负责送外卖他们共用: 原料冰箱(共享内存) 工作台(栈空间)但不共享: 自己的工牌(线程ID) 心情日记(线程本地存储) 代码示例(Python多线程下载): im
    发表于 03-26 09:27

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    华为云 X 实例 CPU 性能测试详解与优化策略

      2.2 Sysbench单线程CPU性能测试   2.3 Sysbench多线程CPU性能测试(4线程)   2.4 高强度多线程CPU性能测试(8
    的头像 发表于 12-30 14:52 1182次阅读
    华为云 X 实例 CPU 性能测试详解与优化策略