ThreadX_note:创建线程

从源码深入接触ThreadX(3) --- 创建线程tx_thread_create(1) 这一片我们来看一下tx_thread_create.c这个文件,由于是第一篇深入源代码,会多写一些ThreadX所有源代码都通用的内容。 /**************************************************************************/ /* */ /* Copyright (c) ... 阅读详情

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 参数传递给任务的入口函数。

RX MCU实战:基于FIT与Azure RTOS USBX构建高效USB通信系统 USB(通用串行总线)是嵌入式设备连接外部世界的核心接口,其驱动开发涉及硬件操作与协议栈的复杂协同。传统裸机轮询方式在实时多任务场景下易导致阻塞,难以满足并发需求。实时操作系统(RTOS)通过任务调度与事件驱动机制,为USB通信提供了高效的解决方案。Azure RTOS USBX作为轻量级USB协议栈,结合瑞萨FIT驱动框架的硬件抽象能力,实现了硬件操作与协议处理的完美分工。这种组合尤其适用于需要稳定、高效USB通信的嵌入式产品,例如工业控制、数据采集和智能设备。本文聚焦于在RX系列高性能微控制器上,将FI 阅读详情

相关推荐

嵌入式系统配置模块(SYSCFG)详解:中断、故障诊断与引脚复用

在嵌入式系统开发中,系统配置模块是芯片硬件资源的核心管理单元,负责中断处理、总线仲裁、引脚复用等关键功能。其工作原理基于寄存器配置,通过精细化管理中断响应流程和内存访问权限,确保系统可靠性与实时性。该模块的技术价值在于提升系统稳定性与资源利用效率,尤其在复杂SoC架构中至关重要。应用场景广泛覆盖工业控制、通信设备及仪器仪表等领域,工程师通过配置EOI寄存器实现中断优雅结束,利用故障诊断寄存器快速定位内存访问错误,并通过PINMUX寄存器灵活分配引脚功能。本文深入解析SYSCFG模块的中断处理机制与故障诊断方

weixin_34295316的博客 407

实时操作系统ThreadX全中文手册上线了

关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏对于很多初学者来说,学习一门技术非常头疼的一件事,就是面对英文资料和手册。不但初学者,对于有一...

strongerHuang 1万+

瑞萨RX系列USB主机MSC驱动FIT模块实战指南

USB大容量存储类(MSC)协议是实现嵌入式设备与U盘、移动硬盘等外部存储设备即插即用数据交换的核心技术。其原理基于USB的批量传输端点和BOT协议,通过封装SCSI命令实现扇区级的读写操作。该技术的核心价值在于为资源受限的嵌入式系统提供了标准化、高兼容性的存储扩展方案,广泛应用于数据采集、固件升级、日志记录等场景。瑞萨电子的USB HMSC FIT模块正是基于此技术,通过分层架构将复杂的USB协议栈、BOT传输和文件系统集成封装,显著降低了在RX系列MCU上实现USB主机存储功能的开发门槛。开发者借助其提

anmishi2025的博客 394

threadx学习笔记(2)线程

关于这部分的详细知识在这两篇博客的基础上,增加了一些具体代码。

m0_71240643的博客 2814

ThreadX学习(1)——概述

ThreadX学习(1)——概述学习参考:组件 学习参考: 《Real-Time Embedded Multithreading: Using ThreadX and ARM》 安富莱_STM32-V7开发板ThreadX内核教程(V0.7) 组件 某些组件是公共资源,这意味着它可以从任何线程访问。访问一个组件与拥有它是不同的。例如,互斥锁可以被任何线程访问,但一次只能被一个线程拥有。 ...

weixin_43739110的博客 5470

Threadx tx_thread_create创建线程

文章目录线程控制块(TCB)_tx_thread_create 线程控制块(TCB) typedef struct TX_THREAD_STRUCT { /* The first section of the control block contains critical information that is referenced by the port-specific...

osnet的博客 4057

ThreadX驱动编写(基于ARM处理器)

1、参考文档及代码 参考《Azure RTOS ThreadX User Guide》"Chapter 5: Device Drivers for ThreadX" ThreadX 6.1.2Versatile/PB代码参考https://github.com/arm7star/ThreadX(未添加驱动) 2、驱动框架介绍 ThreadX驱动框架比较简单,与linux驱动比较类似,中断服务程序进行简单的中断处理(外设硬件中断处理、清除外设及中断控制器中断,类似linux中断上半部),然后唤..

arm7star的博客 2095

STM32使用ThreadX示例以及tx_thread_create解析

函数,可以在ThreadX环境中创建新的线程,并为其指定入口函数、堆栈、优先级等参数。每个任务都有一个独立的堆栈和一个入口函数,可以在其中执行任务的操作。ThreadX使用固定优先级调度算法来确定线程执行的顺序,优先级较高的线程将在优先级较低的线程之前执行。通常通过定义一个数组,并将数组的地址作为参数传递给此处,用于分配线程的堆栈空间。当一个线程的优先级高于或等于抢占阈值时,它可以抢占当前正在执行的线程。:线程的入口函数,即线程创建后要执行的函数。函数返回一个无符号整数类型的值,表示函数执行的状态。

小灰灰的博客 1713

嵌入式开发中环形缓冲区原理与瑞萨RX LONGQ模块实战应用

环形缓冲区是一种高效管理数据流的生产者-消费者模型,其核心原理是通过循环利用固定内存空间,实现数据的先进先出存取,解决了嵌入式系统中数据生产与消费速度不匹配的经典问题。这种数据结构在资源受限的嵌入式环境中具有重要技术价值,能够有效避免数据覆盖风险,减少复杂同步机制带来的开销。在实际应用中,环形缓冲区广泛应用于传感器数据采集、串口通信、任务间消息传递等场景,确保数据流的平滑与高效处理。瑞萨电子的Firmware Integration Technology为RX微控制器提供了LONGQ模块,这是一个经过充分测

weixin_30417487的博客 395

深入解析ThreadX任务管理:函数探秘

在实时嵌入式系统开发中,ThreadX作为一种可靠、高效的实时操作系统(RTOS),其任务管理功能备受开发者青睐。通过合理使用上述ThreadX任务管理函数,开发者可以实现任务的创建、调度、挂起、终止和睡眠等操作。通过指定任务的入口函数、堆栈大小、优先级等参数,该函数将为任务分配必要的资源并将其加入到任务列表中。任务终止后,所占用的资源将被释放,并且不再参与调度。当然,ThreadX还有更多功能丰富的任务管理函数,如互斥锁、定时器等,可以根据具体需求进行使用。函数可恢复被挂起的任务,使其重新参与调度。

小灰灰的博客 1389

企业碳排放计算方法与实践:从年度总量到月度分配的完整流程

本文系统介绍了企业碳排放计算的全流程方法,包括数据预处理、能源活动与产品生产碳排放计算、年度汇总及月度分配优化。通过ARIMA模型预测补充缺失数据,采用二次规划算法实现基于用电量模式的月度碳排放分配,确保计算结果的准确性与合理性。该方法为企业碳排放管理提供了科学工具,有助于精准监控排放、制定减排策略并满足合规要求。实施中需注重数据质量控制和排放因子选择,并根据企业特点调整参数。该流程适用于制造业企业,为实现碳中和目标提供可靠的数据基础和管理支持。

applehunqiu的博客 1572

Kinetis SDK v1.2.0实战指南:从架构解析到外设驱动与调试优化

在嵌入式系统开发中,软件开发套件(SDK)是连接硬件与应用程序的关键桥梁,其核心价值在于通过标准化的软件架构提升开发效率与代码可移植性。SDK通常基于分层设计理念,构建硬件抽象层(HAL)和外围设备驱动(Peripheral Driver)等核心组件。HAL提供原子化的硬件操作原语,确保对硬件的直接且灵活的控制;而外围设备驱动则封装了常见应用场景,简化了开发流程。这种设计能显著降低底层硬件差异带来的复杂度,其技术价值体现在加速产品上市、保障代码质量及便于跨平台迁移。在工业控制、物联网终端等场景中,合理利用S

chuncui2576的博客 529

关于Vscode配置Unity环境时的一些报错问题(持续更新)

3.找到设置文件,添加如下代码,用于告诉VSCode)在处理 C# 项目时优先使用 C# 扩展来加载和管理项目,而不是使用 C# Dev Kit 或其他扩展。1.很可能是unity的插件版本问题,打开window > package manager将。2.很可能是项目文件的问题,建议unity打开edit > perfercenes。3.手动重装其他版本的.Net框架(去官网找,多下几个无所谓的)解决:(由于造成问题不一样,所以建议都尝试一次)下载net请求超时(一般都会超时很正常的)

bug制造机 1888

从0到1:5分钟本地跑起The Delegation 3D AI办公室的完整指南

The Delegation 是一款免代码(no-code)的 3D AI 办公室实验场,让 AI 爱好者、教育工作者和创意开发者无需写一行代码,就能在一个"活"的 3D 办公室里探索、设计并交互 Agentic AI(智能体)系统:由 LLM 驱动的角色会在共享的虚拟工作区里自主协作——它们自主导航到工位坐下、干活、互相讨论,而你只需通过节点式编辑器和看板界面来指挥整个 AI 团队。 [![T

gitblog_01091的博客 494

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 186

从零开始:使用Labelme完成图像语义分割标注全流程

本文详细介绍了如何使用Labelme工具完成图像语义分割标注的全流程,从环境安装、数据准备到核心标注操作,并重点讲解了如何将标注结果转换为PASCAL VOC等深度学习框架可用的标准数据集格式。文章还提供了关键的避坑指南和高效技巧,帮助初学者快速上手,高效产出高质量的标注数据。

weixin_29073241的博客 492

ThreadX_笔记

安富莱_STM32-v7开发板ThreadX内核教程——笔记1.ThreadX--任务管理1.1 裸机-栈1.2 RTOS--栈1.3 MSP、PSP1.4 实际应用中系统栈空间分配多大?1.5 ThrreadX 的任务状态1.6 ThreadX 启动流程2.栈大小及溢出2.1 任务栈大小的确定2.2 ThrreadX 的栈溢出检测机制2.2.1 实现原理2.2.2 实现方法3.ThrreadX 中断优先级配置,含 BasePrrii 配置方案 1.ThreadX–任务管理 1.1 裸机-栈      管

oDuanYanGuHong的博客 3946

别再被坑了!手把手教你从官网下载免费正版Notepad++(附最新网盘链接)

本文详细指导如何从Notepad++官网安全下载正版软件,避免山寨版本带来的安全风险。通过识别官网特征、推荐官方下载渠道、揭露山寨网站骗局及验证正版功能,帮助用户高效获取纯净的Notepad++代码编辑器,并分享实用插件和配置优化技巧。

weixin_42527654的博客 562

创建线程 tx_tc.c

UINT_tx_thread_create( //指向线程控制块(thread control block)的指针 TX_THREAD*thread_ptr, //指向线程名字的指针 CHAR*name, //指定线程执行的初始C函数。当线程从此入口函数返回时,它将处于Completed并无期限Suspended VOID(*entry_function)(ULONG), ...

qq_45669254的博客 440

基于Python的专利数据爬虫开发指南:从入门到实战

本文将详细介绍如何使用Python开发一个高效的专利数据爬虫系统,涵盖最新技术栈如Playwright、异步IO、反反爬策略等。文章包含完整代码实现、性能优化技巧及法律合规建议,帮助读者构建可投入生产的专利数据采集解决方案。专利数据是技术创新的重要指标,包含技术细节、申请人信息、法律状态等宝贵信息。企业竞争情报分析技术趋势预测研发方向决策知识产权战略制定。

2201_76125261的博客 1588

十.镜头知识之畸变问题

对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2124

《安富莱_STM32-V6开发板ThreadX内核教程(V1.5)》简单整理学习

摘录自《安富莱 ThreadX内核教程 V1.5》

qq_37846131的博客 2781

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ThreadX学习(2)——线程

ThreadX学习(2)——线程学习参考:ThreadX中的线程线程创建堆栈分配互斥锁线程优先级优先级反转优先级继承抢占阈值线程状态数据结构TCB就绪列表API 学习参考: 《Real-Time Embedded Multithreading: Using ThreadX and ARM》 安富莱_STM32-V7开发板ThreadX内核教程(V0.7) ThreadX中的线程 在ThreadX中,一般没有进程的概念,统称为线程。 关于调度器的实现细节,ThreadX可能是用汇编写的,没看懂。 T

weixin_43739110的博客 6033

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ThreadX内核源码分析(SMP) - 核间通信(arm)

多核情况下,一个核可能改变另外一个核的执行状态,例如一个核挂起另外一个核正在执行的线程,如果没有机制通知另外一个核该线程被挂起的话,那么被挂起的线程就感知不到自己被挂起了;ThreadX内核使用SGI中断,从一个核发送一个中断信号到目的核上去,从而使另外一个核产生中断,另外一个核就会去检查状态变化,例如是否要重新调度(别的核改变了该核需要执行的线程)。 参考《ARMv8-A_Architecture_Reference_Manual_(Issue_A.a).pdf》"D8.6.28 ICC_S

arm7star的博客 2920

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ThreadX RTOS 代码详解

通过对 ThreadX RTOS 任务管理、同步与通信机制以及中断处理等核心代码的详细分析,我们深入了解了其运行原理和实现方式。这些代码是 ThreadX 高效、稳定运行的基础,掌握它们对于基于 ThreadX 进行嵌入式系统开发至关重要。在实际开发中,开发者可以根据具体需求,灵活运用 ThreadX 的各项功能,优化系统性能,实现复杂的嵌入式应用。

m0_73978383的博客 2079
上一篇: ThreadX手动移植到stm32f103c8t6_hal库
下一篇: 在ThreadX中如何使用信号量详解
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值