ThreadX分析(一)-程序员宅基地

技术标签: 经验分享  操作系统  其他  嵌入式  

简介

项目地址:https://github.com/azure-rtos/threadx

  • ThreadX被设计的像C库一样,只有被用到的组件才会编译进最终的App中,这样可以保证最终生成的应用软件只包含自己所需的组件,拥有更小的应用体积(一般2KB~15KB左右)。
  • ThreadX易于裁剪,即适用于微控制器也适用与像CISC/RISC/DSP等强大的处理器上。
  • ThreadX除了提供内核之外还提供了usbx、levelx、netxduo、filex、guix等强大的组件。
  • ThreadX使用picokernel结构,相较于其他微内核结构拥有更高的效率
  • ThreadX使用C语言和少量的汇编语言编写,易于移植,可以在一周内完成移植工作
  • Simple picokernel architecture(简单的picokernel 架构)
  • Automatic scaling (small footprint)(自动缩放,占用空间小)
  • Deterministic processing()
  • Fast real-time performance(快速实时的性能)
  • Preemptive and cooperative scheduling(抢占式协同调度)
  • Flexible thread priority support(支持动态优先级)
  • Dynamic system object creation(动态对象创建)
  • Unlimited number of system objects(不限制系统对象数量)
  • Optimized interrupt handling(优化的中断处理)
  • Preemption-threshold
  • Priority inheritance(优先级继承)
  • Event-chaining
  • Fast software timers(高效的软件定时器)
  • Run-time memory management(Run-time内存管理)
  • Run-time performance monitoring(Run-time性能监视)
  • Run-time stack analysis(Run-time堆分析)
  • Built-in system trace(内嵌系统追踪调试)
  • Vast processor support(支持大量的处理器)
  • Vast development tool support(支持很多开发工具)
  • Completely endian neutral

组件间的依赖关系

在这里插入图片描述

其中

  • usbx:USB库
  • levelx: 提供了NAND和NOR闪存磨损均衡操作方式
  • netxduo: 网络库
  • filex: 文件库
  • guix: GUI库
  • threadx: os

构建编译

这将编译生成一个库文件,可以将这个库文件包含在自己的项目中

$ mkdir build; cd build
$ cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=cmake/cortex_linux.cmake -GNinja ../
$ cmake --build .

注意:除了编译threadx之外,要编译其他组件的时候都要参考组件间的关系图来完成编译依赖

Threadx概览

Threadx目录结构
threadx
├── CONTRIBUTING.md 
├── LICENSE.txt
├── LICENSED-HARDWARE.txt
├── README.md
├── SECURITY.md
├── CMakeLists.txt 
├── cmake				//保存了相应平台的cmake设置,会在目录的CmakeList.txt中调用
├── common				//threadx的源码(for 单核CPU)
├── common_modules		//支持动态应用加载相关代码
├── common_smp			//threadx的源码(for 多核CPU)
├── docs
├── ports				//与平台对应的代码(for 单核CPU),移植时需要这个里面的代码
├── ports_module		//动态应用加载平台相关代码
├── ports_smp			//与平台对应的代码(for 多核CPU)
├── samples				//例程
└── utility				//包含了低功耗相关代码和FreeRTOS适配层

调度器定时器初始化相关操作在threadx的***tx_initialize_low_level***汇编文件

下面是一些重要的文件

文件名 描述
tx_api.h threadx的API文件
tx_port.h 包含对应平台的数据定义和结构体定义
demo_threadx.c threadx的demo文件
tx.a (tx.lib) threadx c源码编译获得的c库,可以在项目中直接使用
使用thread的步骤
  1. 包含tx_api.h

  2. 创建一个main函数,在main函数中必须调用***tx_kernel_enter***来启动threadx,不涉及到threadx内核相关的初始化工作应该在此函数之前初始化。

    注意:tx_kernel_enter函数不会返回。

  3. 在main.c中创建***tx_application_define*** 函数,在这里创建系统初始资源包括threads, queues, memory pools, event flags groups, mutexes, 和semaphores。

  4. 编译应用程序并连接***tx.lib***,最终生成可执行程序。

#include "tx_api.h"
unsigned long my_thread_counter = 0;
TX_THREAD my_thread;
main( )
{
    
    /* Enter the ThreadX kernel. */
    tx_kernel_enter( );
}
void tx_application_define(void *first_unused_memory)
{
    
    /* Create my_thread! */
    tx_thread_create(&my_thread, "My Thread",
    my_thread_entry, 0x1234, first_unused_memory, 1024,
    3, 3, TX_NO_TIME_SLICE, TX_AUTO_START);
}
void my_thread_entry(ULONG thread_input)
{
    
    /* Enter into a forever loop. */
    while(1)
    {
    
        /* Increment thread counter. */
        my_thread_counter++;
        /* Sleep for 1 tick. */
        tx_thread_sleep(1);
    }
}
Threadx配置
最小代码配置
TX_DISABLE_ERROR_CHECKING
TX_DISABLE_PREEMPTION_THRESHOLD
TX_DISABLE_NOTIFY_CALLBACKS
TX_DISABLE_REDUNDANT_CLEARING
TX_DISABLE_STACK_FILLING
TX_NOT_INTERRUPTABLE
TX_TIMER_PROCESS_IN_ISR
最快运行速度配置

​ 在最小代码量的基础上添加下面两个配置

TX_REACTIVATE_INLINE
TX_INLINE_THREAD_RESUME_SUSPEND
全局time源配置

​ 在***tx_port.h***中配置全局时钟,其定义了多少个tick中断表示一秒(例如:10ms产生一次中断则这个值设置成100)在threadx组件中有使用这个变量FileX, NetX, GUIX, USBX,等。

注意:需要与系统心跳时间相匹配,否则会使计算出来的时间错误

TX_TIMER_TICKS_PER_SECOND	100
详细配置描述

TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO

如果定义了这个宏,则使能了byte内存池的性能收集功能。默认未定义此宏

TX_DISABLE_ERROR_CHECKING

如果定义了这个宏,则会跳过给所有的基本参数检查,这大概能提高30%左右的性能以及减少image大小,默认未定义此宏

注意:部分函数的返回值也会变成无效的如果定义了此宏

TX_DISABLE_NOTIFY_CALLBACKS

如果定义了这个宏,则会导致各个模块中的notify callbacks失效,这样可以稍微减少代码大小以及提高性能。默认未定义此宏

TX_DISABLE_PREEMPTION_THRESHOLD

如果定义了这个宏,则会取消抢占阈值调度功能,会稍微减少代码大小并且提高性能。默认未定义

TX_DISABLE_REDUNDANT_CLEARING

如果定义了这个宏,则会取消Threadx对全局未赋值变量以及结构体的清零功能。只有在编译器初始化代码中有做这个清零操作的时候才能取消这个功能。定义这个宏会稍微减少代码大小并且提高系统初始化时的性能。默认这个宏未定义

TX_DISABLE_STACK_FILLING

如果定义了这个宏,禁止在创建时将0xEF值放在每个线程堆栈的每个字节中。默认情况下,没有定义此选项。

TX_ENABLE_EVENT_TRACE

定义后,ThreadX启用事件收集代码来创建TraceX跟踪缓冲区。

TX_ENABLE_STACK_CHECKING

定义后,启用ThreadX运行时堆栈检查,包括分析使用了多少堆栈,以及检查堆栈区域前后的数据模式“栅栏”。如果检测到堆栈错误,则调用已注册的应用程序堆栈错误处理程序。这个选项确实会略微增加开销和代码大小。查看***tx_thread_stack_error_notify***API函数以获得更多信息。默认情况下,没有定义此选项。

TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO

定义后,启用收集事件标志组的性能信息。默认情况下,没有定义此选项。

TX_INLINE_THREAD_RESUME_SUSPEND

定义后,ThreadX通过内联代码改进了***tx_thread_resume*** 和***tx_thread_suspend*** API调用。这增加了代码大小,但提高了这两个API调用的性能。

TX_MAX_PRIORITIES

定义ThreadX的优先级级别。取值范围为32 ~ 1024(含1024),必须能被32整除。增加支持的优先级级别的数量会使每组32个优先级的RAM使用增加128字节。然而,这对性能的影响微乎其微。缺省情况下,该值被设置为32个优先级。

TX_MINIMUM_STACK

定义最小堆栈大小(以字节为单位)。它用于在创建线程时进行错误检查。默认值是特定于平台的,可以在***tx_port.h***中找到。

TX_MISRA_ENABLE

在定义时,ThreadX利用了符合MISRA C的约定。详情请参阅***ThreadX_MISRA_Compliance.pdf***。

TX_MUTEX_ENABLE_PERFORMANCE_INFO

定义后,启用对mutex(互斥锁)的性能信息的收集。默认情况下,没有定义此选项。

TX_NO_TIMER

在定义时,ThreadX计时器逻辑是完全禁用的。这在没有使用ThreadX计时器特性(线程睡眠、API超时、时间片和应用程序计时器)的情况下非常有用。如果指定了TX_NO_TIMER ,则还必须定义选项TX_TIMER_PROCESS_IN_ISR

TX_NOT_INTERRUPTABLE

在定义时,ThreadX不会试图最小化中断锁定时间。这将导致更快的执行,但会略微增加中断锁定时间。

TX_QUEUE_ENABLE_PERFORMANCE_INFO

定义后,启用收集队列上的性能信息。默认情况下,没有定义此选项。

TX_REACTIVATE_INLINE

定义后,内联执行ThreadX计时器的重新激活,而不是使用函数调用。这会提高性能,但会略微增加代码大小。默认情况下,没有定义此选项。

TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO

定义后,启用对信号量的性能信息的收集。默认情况下,没有定义此选项。

TX_THREAD_ENABLE_PERFORMANCE_INFO

定义后,启用收集线程上的性能信息。默认情况下,没有定义此选项。

TX_TIMER_ENABLE_PERFORMANCE_INFO

定义后,启用对计时器收集性能信息。默认情况下,没有定义此选项。

TX_TIMER_PROCESS_IN_ISR

定义后,消除了ThreadX的内部系统计时器线程。这将提高计时器事件的性能,并减少RAM需求,因为不再需要计时器堆栈和控制块。但是,使用此选项将所有计时器过期处理移动到计时器ISR级别。默认情况下,没有定义此选项。

TX_TIMER_THREAD_PRIORITY

定义内部ThreadX系统计时器线程的优先级。默认值为优先级0—ThreadX中的最高优先级。默认值定义在***tx_port.h***中。

TX_TIMER_THREAD_STACK_SIZE

定义内部ThreadX系统计时器线程的堆栈大小(以字节为单位)。该线程处理所有线程睡眠请求和所有服务调用超时。此外,所有应用程序计时器回调例程都是从这个上下文中调用的。默认值是特定于平台的,可以在***tx_port.h***中找到。

获取tx version

可以使用**_tx_version_id这个变量在程序中获取tx version,在*tx_port.h***中定义了这个变量

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38901733/article/details/116352617

智能推荐

OpenAI ChatGPT API 文档之 Embedding_text-embedding-ada-002-程序员宅基地

文章浏览阅读1.5k次。OpenAI 中的文本 Embedding 衡量文本字符串之间的相关性。_text-embedding-ada-002

【上海大学数字逻辑实验报告】六、时序电路_74ls74检验连接-程序员宅基地

文章浏览阅读3.3k次,点赞74次,收藏62次。上海大学数字逻辑实验报告//时序电路//掌握同步二进制计数器和移位寄存器的原理//用分立元件构成2位同步二进制加计数器//在Quartus II上设计单向移位寄存器//在Quartus II上设计环形计数器//构成3位同步二进制加(减)计数器//用74LS74构成双向移位寄存器_74ls74检验连接

QT使用 C++编写 QML 扩展_c++ qt qml怎么使用-程序员宅基地

文章浏览阅读546次。最终结果将是一个简单的饼图显示,由几个自定义QML类型实现,这些类型通过QML功能(如绑定和信号)连接在一起,并通过插件提供给QML运行时。扩展 QML 时的一项常见任务是提供一种新的 QML 类型,该类型支持内置 .例如,这可以用于实现特定的数据模型,或为类型提供自定义绘制和绘图功能,或访问无法通过内置 QML 功能访问的系统功能(如网络编程)。它可能有许多其他类型的属性。为了构建项目,我们包含文件,链接到库,并为向 QML 公开的任何类型定义一个名为“Charts”的类型命名空间,版本为 1.0。_c++ qt qml怎么使用

word2016提示mathtype文件未找到:MathPage.wll_mathtype commands 6 for word2016-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏4次。word2016提示mathtype文件未找到:MathPage.wll解决office2016中的word2016的mathtype无法使用的问题,这类问题通常体现为,打开word后提示“未找到文件:mathtype.wll”,或者错误53等。工具/原料word2016mathtype方法/步骤步骤1先安装word,再安装mathtype,然后在路径C:\Program Files (x86)\MathType\Office Support\64(如果自定义安装路径的话请选择对应的路径,32_mathtype commands 6 for word2016

计算机网络方向的国内外期刊及会议简报_journal of information hiding and privacy protecti-程序员宅基地

文章浏览阅读741次。计算机网络方面的研究历史“悠久”、研究方向众多,可以投的期刊和会议也相当繁杂。这里简单梳理一下通常可以投的各大期刊和会议,以便相关研究方向的入门学者们通览其概况,从而尽早进入科研状态。..._journal of information hiding and privacy protection 几区

react-native 仿网易云音乐旋转唱片动画_react-native 音乐旋转唱片效果-程序员宅基地

文章浏览阅读1.4k次。一直觉得网易云音乐的播放界面很酷,现在利用react-native 动画实现这个界面.要点有两个,1图片要变园使用borderRadius=1/2height.2动画处理改变图片的旋转角度Untitled.gif使用方法,直接react-native init 一个项目,然后把这段代码复制到入口文件中下面看代码/** * Sample React Native_react-native 音乐旋转唱片效果

随便推点

JSON 之 SuperObject(17): 实例 - 借用 Google 实现全文翻译-程序员宅基地

文章浏览阅读63次。为什么80%的码农都做不了架构师?>>> ...

Second Lien Debt_first lien debt 意思-程序员宅基地

文章浏览阅读714次。http://www.investopedia.com/terms/s/secondliendebt.asp#axzz1lnDvrq00Definition of 'Second Lien Debt'Debts that are subordinate to the rights of other, more senior debts issued against the same col_first lien debt 意思

【Scala教程】Scala 简介与配置_scala 存配置信息的写法-程序员宅基地

文章浏览阅读272次。Scala 简介与配置文章目录Scala 简介与配置Scala 简介Scala 特性面向对象特性函数式编程静态类型扩展性并发性Scala 安装Java 开发环境配置Scala 下载与安装系统环境配置参考Scala 简介Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala 运行在Java虚拟机上,并兼容现有的Ja..._scala 存配置信息的写法

酒店预订订房小程序源码系统 平台版 带完整的搭建教程_微酒店预订 源码-程序员宅基地

文章浏览阅读422次,点赞9次,收藏9次。传统的酒店预订系统已无法满足消费者的需求,因此,开发一款简单、高效、功能齐全的酒店预订小程序成为行业迫切的需求。同时,系统还支持积分兑换、会员优惠券等功能。2.完整的酒店信息展示:酒店详情页、房型展示页、价格展示页等,用户可以直观地了解酒店的各种信息。4.优惠活动推送:系统会根据用户的浏览记录和预订习惯,推送相应的优惠活动信息,提高用户的预订率。3.多种预订方式:支持在线预订、电话预订、微信预订等多种预订方式,方便用户选择。7.完整的支付体系:支持支付宝、微信支付等多种支付方式,保障用户的支付安全。_微酒店预订 源码

FS4052】12.6v2A三节锂电池充电芯片方案_fs4052f-程序员宅基地

文章浏览阅读802次。FS4052】是我公司热销的一款锂电池充电芯片。芯片输入电压DC 4-23v,待机功耗小于0.05W,可编程充电电压和充电电流,芯片的灵活应用范围被广大客户给予了极高的应用好评。我公司AH2155锂电池充电ic常用参数有:4.2v1A单节锂电充电,8.4v1.5A双节锂电充电,12.6v2A三节锂电池充电,8.4v2A两串两并四节锂电池充电等应用参数。其应用的产品有12v适配器锂电池充电方案,车载锂电池充电方案,太阳能板充电方案等其他太阳能充电应用方案。FS4052】是一个4V-23V输入电压,输出_fs4052f

Verilog十大基本功---testbench的设计 文件读取和写入操作_vivado如何写testben-程序员宅基地

文章浏览阅读2.3w次,点赞18次,收藏152次。转自:https://blog.csdn.net/times_poem/article/details/52036592需求说明:Verilog设计基础内容 :testbench的设计 读取文件 写入文件来自 :时间的诗十大基本功之 testbench1. 激励的产生对于 testbench 而言,端口应当和被测试的 module 一一对应。端口分为 input,outpu..._vivado如何写testben

推荐文章

热门文章

相关标签