ThreadX_note:创建线程

ThreadX 创建线程

ThreadX 是一款实时操作系统 (RTOS),它提供了一套全面的 API,可以用于创建和管理线程。
在这里插入图片描述

创建线程

在 ThreadX 中,我们可以使用 tx_thread_create 函数来创建线程。

exam:

#include "tx_api.h"

/* 定义任务堆栈大小 */
#define TASK_STACK_SIZE 1024

/* 定义任务优先级 */
#define TASK_PRI 16

/* 定义两个任务的ID */
TX_THREAD thread_0;
TX_THREAD thread_1;

/* 定义任务堆栈 */
uint8_t thread_0_stack[TASK_STACK_SIZE];
uint8_t thread_1_stack[TASK_STACK_SIZE];

/* 任务入口函数 */
void thread_0_entry(ULONG thread_input) {
    /* 执行任务0的操作 */
}

void thread_1_entry(ULONG thread_input) {
    /* 执行任务1的操作 */
}

/* 程序入口函数 */
int main(void) {
    /* 初始化STM32硬件 */
    /* 初始化ThreadX内核 */
    tx_kernel_enter();

    /* 创建任务0 */
    tx_thread_create(&thread_0, "thread_0", thread_0_entry, 0, 
                     thread_0_stack, TASK_STACK_SIZE, 
                     TASK_PRI, TASK_PRI, TX_NO_TIME_SLICE, TX_AUTO_START);

    /* 创建任务1 */
    tx_thread_create(&thread_1, "thread_1", thread_1_entry, 0, 
                     thread_1_stack, TASK_STACK_SIZE, 
                     TASK_PRI, TASK_PRI, TX_NO_TIME_SLICE, TX_AUTO_START);

    /* 启动ThreadX内核 */
    tx_kernel_start();

    /* 永远不会运行到这里 */
    return 0;
}

tx_thread_create 函数解析

tx_thread_create 函数是 ThreadX 库中用于创建线程的函数。它的原型如下:

UINT tx_thread_create(TX_THREAD *thread_ptr, CHAR *name_ptr, 
                      VOID (*entry_function)(ULONG), ULONG entry_input, 
                      VOID *stack_start, ULONG stack_size, 
                      UINT priority, UINT preempt_threshold, 
                      ULONG time_slice, UINT auto_start);

下面对 tx_thread_create 函数的各个参数进行解析:

  • thread_ptr:指向 TX_THREAD 类型的指针,用于保存新创建线程的控制块信息。
  • name_ptr:线程的名称,以字符串形式提供。
  • entry_function:线程的入口函数,即线程创建后要执行的函数。它必须是一个无返回值(void),接受 ULONG 类型参数的函数指针,因为 ThreadX 会将传递给线程的参数作为 entry_input 传递给入口函数。
  • entry_input:线程入口函数的输入参数。可以是任何类型的数据,但将其转换为 ULONG 类型并在入口函数中进行相应的类型转换。
  • stack_start:线程堆栈的起始地址。通常通过定义一个数组,并将数组的地址作为参数传递给此处,用于分配线程的堆栈空间。
  • stack_size:线程堆栈的大小,以字节为单位。
  • priority:线程的优先级。ThreadX 使用固定优先级调度算法来确定线程执行的顺序,优先级较高的线程将在优先级较低的线程之前执行。
  • preempt_threshold:线程的抢占阈值。当一个线程的优先级高于或等于抢占阈值时,它可以抢占当前正在执行的线程。
  • time_slice:线程的时间片大小。时间片是指线程在多任务系统中执行的时间段。如果设置为 0,则禁用时间片调度。
  • auto_start:指示线程是否在创建后自动启动的标志。如果设置为 TX_AUTO_START,则线程在创建后立即运行。如果设置为其他非零值或 0,则线程需要手动启动。

tx_thread_create 函数返回一个无符号整数类型的值,表示函数执行的状态。常见的返回值包括 TX_SUCCESS(成功)和 TX_PTR_ERROR(参数错误)等。

通过使用 tx_thread_create 函数,可以在 ThreadX 环境中创建新的线程,并为其指定入口函数、堆栈、优先级等参数。这样就可以在 STM32 微控制器上同时运行多个线程,实现多任务处理和并发执行的应用程序。

在 ThreadX 中,线程入口函数只接受一个 ULONG 类型的参数。如果你需要传递多个参数给线程,你可以使用一个结构体来封装这些参数,然后将结构体的地址转换为 ULONG 类型并传递给线程。

exam:

#include "tx_api.h"

/* 定义任务堆栈大小 */
#define TASK_STACK_SIZE 1024

/* 定义任务优先级 */
#define TASK_PRI 16

/* 定义任务的ID */
TX_THREAD thread;

/* 定义任务堆栈 */
uint8_t thread_stack[TASK_STACK_SIZE];

/* 定义任务参数结构体 */
typedef struct {
    int param1;
    float param2;
    char* param3;
} thread_params_t;

/* 定义任务参数 */
thread_params_t thread_params = {123, 456.78, "Hello, ThreadX"};

/* 任务入口函数 */
void thread_entry(ULONG thread_input) {
    /* 将 thread_input 转换回原来的结构体指针 */
    thread_params_t* params = (thread_params_t*)thread_input;

    /* 现在你可以使用 params->param1, params->param2 和 params->param3 了 */
}

/* 程序入口函数 */
int main(void) {
    /* 初始化STM32硬件 */
    /* 初始化ThreadX内核 */
    tx_kernel_enter();

    /* 创建任务,将结构体的地址转换为 ULONG 类型并传递给线程 */
    tx_thread_create(&thread, "thread", thread_entry, (ULONG)&thread_params, 
                     thread_stack, TASK_STACK_SIZE, 
                     TASK_PRI, TASK_PRI, TX_NO_TIME_SLICE, TX_AUTO_START);

    /* 启动ThreadX内核 */
    tx_kernel_start();

    /* 永远不会运行到这里 */
    return 0;
}

以上代码演示了如何创建一个带有多个参数的任务并启动 ThreadX 内核。每个任务都有一个独立的堆栈和一个入口函数,可以在其中执行任务的操作。任务的参数通过 tx_thread_create 函数的 entry_input 参数传递给任务的入口函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/363136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansible自动化运维实战

一、abstract简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.无客户端。我们要学一些Ansible的安装和一些基…

AI论文指南|ChatGPT在论文讨论部分能起到什么作用?

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼: AI论文指南|ChatGPT在论文讨论部分能起到什么作用? 讨论部分是一篇论文的精华所在,也是写作中最难的部分。讨论部分主要是将文章…

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式? 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利…

coreldraw怎么添加箭头?

使用coreldraw的时候知道箭头在哪里添加吗?下面小编就给大家带来coreldraw箭头添加教程,有需要的小伙伴不要错过哦。 coreldraw添加箭头方法 1、首先选择桌面Coreldraw格式图片。 2、然后点击文件夹按钮打开文件。 3、最后点击上方工具横线&#xff0c…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外,它还能够完成多种任务,如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用,而且免费的chatGPT网站,AI…

qt学习:http+访问百度智能云api实现车牌识别

目录 登录到百度智能云,找到文字识别 完成操作指引 开通 查看车牌识别的api文档 ​编辑​编辑 查看自己应用的api key 查看回应的数据格式 编程步骤 ui界面编辑 添加模块,头文件和定义变量 新建两个类,一个图像Image类&#xff0c…

使用Docker部署WBO白板并结合内网穿透实现远程访问WBO白板

本文主要是如何使用Docker部署WBO白板并实现公网地址远程访问的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句&am…

leetcode刷题(剑指offer)54.螺旋矩阵

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:ma…

编译和链接哪个才是最“猴急”的呢???

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

Windows Server 2003 DNS服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DNS服务器是什么? 二、配置服务器 1.实验环境搭建 2.服务器搭建 3)安装Web服务器和DNS服务器 4)查看安装是否成功 5)这里直接配置DNS服务器了,Web服务器如何配置我已经发布过了 文章目录 Windows Serve…

从困惑到精通:私域运营领域10大问题全解析!

一、到底什么是“私域” 在探讨私域流量的实际操作之前,品牌需要对“私域”有一个清晰的认识。那么,究竟什么是“私域”呢? 有观点认为,私域是品牌方掌握的用户群体,这些用户可以在品牌的运营、沉淀和变现中发挥重要…

【第二十二课】最短路:dijkstra算法 ( acwing849 / acwing850 / c++ 代码)

目录 dijkstra算法求最短距离步骤 朴素的dijkstra算法---acwing-849 代码如下 代码思路 堆优化版的dijkstra算法---acwing-850 代码如下 关于最短路问题分有好几种类型 : 单源就是指:只求从一个顶点到其他各顶点 多源是指:要求每个顶…

基于springboot+vue的旅游管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究现状…

uniapp顶部导航栏高度适配

为了实现好看又实用的顶部导航栏,不得不自己定义导航栏样式。而自己定义的导航栏高度会因为手机的型号不同所展示的效果也就不同,所以只能通过适配高度来达到预期的效果 1.需要在page.json文件中对需要自定义导航栏文件进行配置 "navigationStyle…

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限,只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次,而 s “bBBb”…

机器学习:梯度下降法(Python)

LinearRegression_GD.py import numpy as np import matplotlib.pyplot as pltclass LinearRegression_GradDesc:"""线性回归,梯度下降法求解模型系数1、数据的预处理:是否训练偏置项fit_intercept(默认True)&…

【数据分享】1929-2023年全球站点的逐月最高气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…

C# Onnx yolov8 仪表指针检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 仪表指针检测 效果 模型信息 Model Properties ------------------------- date:2024-01-31T11:19:38.828556 author:Ultralytics task:detect license:AGPL-…

wordpress怎么做产品展示站?推荐使用MOK主题和ent主题

大多数WordPress站点都是个人博客网站,主要以文章性质的图文为主。不过部分站长想要用WordPress搭建一个产品展示站,应该怎么做呢? 其实,WordPress可以用来建立各种各样的博客网站,包括个人博客、企业网站、商城、影视…

小白级教程,10秒开服《幻兽帕鲁》

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 前言 马上过年…
最新文章