1.ThreadX系列 | 最新v6.1.6版本在MDK中的源码移植方法
2.ãPocoç¬è®°ã线ç¨Thread
ThreadX系列 | 最新v6.1.6版本在MDK中的移植方法
本文分享了在MDK中移植ThreadX系列最新v6.1.6版本的方法,特别强调了更新过程及与之前的下载移植体验的比较。移植的源码开发板为小熊派IoT开发板,主控为STMLRCT6。下载首先,源码用户需要准备一份包含「正常使用printf串口输出的下载兑奖网站源码裸机工程」,推荐使用cubemx生成。源码
接着,下载从GitHub开源仓库获取ThreadX源码,源码将源码添加到MDK工程中。下载具体步骤包括创建threadX/common分组,源码将threadX/common/src下的下载所有c文件添加到此分组,以及新建threadX/ports分组,源码根据编译环境(例如使用AC5编译器)添加相应的下载.s文件。设置编译器为AC5,源码sync源码详解并添加头文件路径,以确保移植过程的顺利进行。
在移植过程中,用户可能会遇到ThreadX官方提供的底层适配文件tx_initialize_low_level.s,该文件中的函数用于处理器的底层初始化。然而,ThreadX在v6版本及其后续版本中对这个文件进行了修改,kvm源码pdf试图接管处理器的底层初始化,包括设置堆栈环境、重新定义向量表以及接管复位程序,这引起了一些争议。尽管ThreadX的意图可能是为了提供更全面的系统支持,但这种做法在某些方面可能并不合适,因为它直接接管了系统中断,电脑版源码而中断管理通常是操作系统的责任。尽管如此,移植工作仍需继续,用户可以通过创建自定义的适配文件来解决与原始文件的不兼容问题。
具体步骤包括复制tx_initialize_low_level.s文件,并创建自定义适配文件tx_initialize_low_level_bearpi.S,其中包含了对原有代码的指标源码打包修改以适应特定的移植需求。例如,修改与STM启动文件相关的代码,如设置时钟频率、初始化Systick定时器、处理堆栈环境等。在适配文件中,用户需要注释掉ThreadX定义的中断向量表和复位处理程序,并根据实际需求调整底层初始化函数。
此外,为了兼容现有代码,用户需要注释掉HAL库提供的中断服务函数,如PendSV和Systick中断服务函数。完成这些步骤后,用户可以编写应用代码,包括创建任务和启动内核。在main.c中包含ThreadX头文件,并在main函数中初始化内核,以完成整个移植过程。通过编译和下载,用户可以在串口终端观察到系统运行结果。
本文分享的移植过程提供了对最新ThreadX版本在特定环境中的应用指南,以及在遇到官方修改时的调整策略。虽然在某些方面存在争议,但通过适当的适配和调整,用户仍能成功地将ThreadX移植至其目标开发板,实现稳定且高效的操作系统功能。
ãPocoç¬è®°ã线ç¨Thread
PocoçThreadæ¯å¯¹æ ååºstd::threadçå°è£ ï¼åæ¶å®ç±»ä¼¼Javaä¸æ ·ï¼æä¾äºRunnableæ¥å£ãæ以使ç¨ä¸æ¯å¯¹æ Javaçãä¸æ ååºä¸åçæ¯ï¼Poco::Threadå建åè¿è¡æ¶ç¸å离çãè¿ä¸ç¹æ ååºè®¾è®¡ç¡®å®ä¸å¤ªå好ãä¾å¦ä¸é¢ä¾åã
åæ ·çä¾å
ç±ä¸é¢å¯è§ï¼ä½¿ç¨åºæ¬è·Java类似ãå建ä¸è¿è¡ä¹å离äºã
çä¸ä¸ä¸»è¦çè¿è¡æ¥å£ï¼æèªPoco1.9æºç
æºç æ件主è¦å å«
1.Thread.h/Thread.cpp
æä¾å¤é¨è°ç¨æ¥å£
å¨Thread.cppä¸å®ä¹äºä¸¤ç§Holder, RunnableHolderåCallableHolderãHolderææ¯æ¯Pocoæ¡æ¶ä¸ç»å¸¸ç¨å°çï¼æ¯å¯¹æä¸ç§ç±»å对象çæéå è£ ã
Runnable为线ç¨è¿è¡ç±»çåºç±»ï¼
Callable为带ä¸ä¸ªåæ°çæ¹æ³
2.Thread_POSIX.h/Thread_POSIX.cpp
3.Thread_VX.h/Thread_VX.cpp
4.Thread_WIN.h/Thread_WIN.cpp
5.Thread_WINCE.h/Thread_WINCE.cpp
è¿å 个æ件ï¼æ¯ä¸ªæ件ä¸é½å®ä¹äºThreadImplï¼ç¨äºä¸åå¹³å°ä¸çå ·ä½å®ç°ï¼Threadç§æ继æ¿ThreadImpï¼ThreadImpç¨äºåªä¸ä¸ªæ件ç±ç¼è¯å®å³å®ã
顺便说ä¸ä¸POSIXç³»ç»ä¸çå®ç°ãå 为使ç¨çæ¯c++ï¼å½æ¶æ²¡æthreadç±»ï¼æ以ææçå®ç°é½æ¯ä½¿ç¨pthreadåºæ¥å®ç°çãå ·ä½ç使ç¨è¯·åèpthreadææ¯ææ¡£ã
6.ThreadLocal.h/ThreadLocal.cpp
ThreadLocalä¸å®ä¹äºä¸ä¸ªç±»ï¼ TLSAbstractSlotç±»ï¼ TLSSlotç±»ï¼ ThreadLocalStorageç±»
TLSAbstractSlotæ¯åºç±»ï¼TLSSlotæ¯æ¨¡æ¿ç±»ï¼éè¿æ¨¡æ¿ææ¯å 裹äºå ·ä½çç±»åãThreadLocalStorageæ¯ç¨äºçº¿ç¨åå¨ï¼å ·ä½æ¯éè¿ä¸ä¸ªmapæ¥å®ç°ã
å 为1.9使ç¨çæ¯c++ï¼è¿æ²¡æå¼ç¨local_threadå ³é®åï¼æ以è¿éæ¯éè¿è¿ç§æ¹å¼å®ç°ã
ThreadLocalStorageå®ä¹å¦ä¸
é£ä¹Poco::Threadçtlsæ¯å¦ä½å®ä¹çï¼
æºç æ件æ¯è¾å°ï¼ä¸»è¦å¦ä¸æ件
1.Thread.h/Thread.cpp
2.Thread_STD.h/Thread_POSIX.cpp/Thread_VX.cpp/Thread_WIN.cpp
Thread.h 主è¦å¯¹å®ç°ç±»ThreadImpçå è£ ï¼å¹¶å®ä¹äºå¯¹å¤æ¥å£ã
Thread_STD.hå®ä¹äºå é¨å®ç°,主è¦æä¾äºThreadImpç±»
Thread_POSIX.cpp/Thread_VX.cpp/Thread_WIN.cppåå«å®ä¹ä¸åå¹³å°ä¸çå ¼å®¹å®ç°
å¨Thread_STD.hä¸å®ä¹äºå 个éè¦ç±»å
å¨Thread.cppä¸å¢å äºä¸¤ç§
private修饰çThreadDataï¼å®ä¹äºçº¿ç¨å é¨æ°æ®ã 1.9ä¸æºç åå«å®ä¹å¨å个平å°å®ç°ç±»ä¸ï¼è¿éæ½ç¦»åºæ¥å®ä¹å¨Thread.cppä¸ãè¾ä¹åçå®ä¹ï¼è¿éé¢å¤çæ¯æ°å¢äºstd::threadæéãå 为ç´æ¥å¼ç¨äºc++ä¸çthreadï¼æäºå®ç°ç´æ¥åå©äºå®ã