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

智能推荐

Java--深入JDK和hotspot底层源码剖析Thread的run()、start()方法执行过程_jdk的源码hotspot跟jdk是分开的-程序员宅基地

文章浏览阅读2.1k次,点赞101次,收藏78次。【学习背景】今天主要是来了解Java线程Thread中的run()、start()两个方法的执行有哪些区别,会给出一个简单的测试代码样例,快速理解两者的区别,再从源码层面去追溯start()底层是如何最终调用Thread#run()方法的,个人觉得这样的学习不论对面试,还是实际编程来说都是比较有帮助的。进入正文~学习目录一、代码测试二、源码分析2.1 run()方法2.2 start()方法三、使用总结一、代码测试执行Thread的run()、start()方法的测试代码如下:public_jdk的源码hotspot跟jdk是分开的

透视俄乌网络战之一:数据擦除软件_俄乌网络战观察(一)-程序员宅基地

文章浏览阅读4.4k次,点赞90次,收藏85次。俄乌冲突中,各方势力通过数据擦除恶意软件破坏关键信息基础设施计算机的数据,达到深度致瘫的效果,同时窃取重要敏感信息。_俄乌网络战观察(一)

Maven私服仓库配置-Nexus详解_nexus maven-程序员宅基地

文章浏览阅读1.7w次,点赞23次,收藏139次。Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。当然也并不是说私服只能建立在局域网,也有很多公司会直接把私服部署到公网,具体还是得看公司业务的性质是否是保密的等等,因为局域网的话只能在公司用,部署到公网的话员工在家里也可以办公使用。_nexus maven

基于AI的计算机视觉识别在Java项目中的使用 (四) —— 准备训练数据_java ocr ai识别训练-程序员宅基地

文章浏览阅读934次。我先用所有的样本数据对模型做几轮初步训练,让深度神经模型基本拟合(数万条记录的训练集,识别率到99%左右),具备初步的识别能力,这时的模型就是“直男”。相较于训练很多轮、拟合程度很高的“油腻男”,它的拟合程度较低,还是“直男愣头青”。..............._java ocr ai识别训练

hibernate 数据库类型 date没有时分秒解决_hibernate解析時間只有年月日沒有時分秒-程序员宅基地

文章浏览阅读688次。一、问题现象:  在数据库表中日期字段中存的日期光有年月日,没有时分秒。二、产生原因:三 解决办法   检查表的相应映射xml文件。 <property name="operateDate" type="Date">如果同上面所写,那问题出在 type类型上了正确写法 :<property name="operateDate" type="java.util..._hibernate解析時間只有年月日沒有時分秒

react-native-tab-navigator的用法_evaluating react-native-tab-navigator.js-程序员宅基地

文章浏览阅读1k次。通过react-native-tab-navigator实现下面这样的底部Tab切换安装npm install react-native-tab-navigator --save属性TabNavigator 属性 属性名 描述 sceneStyle 切换的每一屏的样式,等同于每一屏根View的样式 tabBarStyle ..._evaluating react-native-tab-navigator.js

随便推点

【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)-程序员宅基地

文章浏览阅读578次,点赞10次,收藏17次。【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)

SEO优化_百度seo resetful-程序员宅基地

文章浏览阅读309次。SEO全称为Search Engine Optimization,中文解释为搜索引擎优化。一般指通过对网站内部调整优化及站外优化,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键词排名,从而把精准..._百度seo resetful

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测_猎食者优化算法-程序员宅基地

文章浏览阅读438次。回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测_猎食者优化算法

苹果发通谍拒绝“热更新”,中国程序猿“最受伤”-程序员宅基地

文章浏览阅读55次。近日,苹果向所有开发者推送警告邮件,宣布未来将禁用 APP 内部的“动态分发”功能。并要求开发者在自家 APP 中删除 JSPatch 相关框架,否则 APP 将面临下架或禁止上架。截止发稿,已有部分开发者新递交的APP受此影响被苹果审核部门拒绝。这一动作,宣告着 APP Store 为“热更新”判了“死刑”,未来应用更新则将进入“原生”时代,用户需..._ios对开发者应用更新频次有限制吗

在VSCode中运行Jupyter Notebook_vscode jupyter notebook-程序员宅基地

文章浏览阅读7.8k次。在VSCode中运行Jupyter Notebook_vscode jupyter notebook

老赵书托(2):计算机程序的构造与解释-程序员宅基地

文章浏览阅读122次。我要推荐的第一本书便是大名鼎鼎的《Structure and Interpretation of Computer Programs》,在国内可以买到中译版,即机械工业出版社的《计算机程序的构造与解释》。 抽象豪不夸张地说,这是一本影响了好几代程序员的书。自从上世纪80年代MIT开始使用这本书作为教材开始,它使用Lisp语言——直到前两年才被Python取代,但是使用哪本教材不得而知,由这..._老赵书拖

推荐文章

热门文章

相关标签