thread编程源码_threadx开源

hacker|
123

文章目录:

Java线程Thread.class源码中未找到线程状态切换的地方,请教各位大神,threadStatus切换源代码在哪里找?

[1]新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(notalive)。

[2]就绪状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态;此时线程是活着的(alive)。

[3]运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。

[4]阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)。

[5]死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thread已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的callstack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtimeexception)的异常;处于Dead状态的线程不是活着的(notalive)。

java Thread源代码sleep函数,有一点看不懂,求解。

static void

sleep(long millis)

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

static void sleep(long millis,

int nanos)

在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

参数:

millis - 以毫秒为单位的休眠时间。

nanos - 要休眠的另外 0-999999 纳秒。

如何移植RT-thread官方的系统源码到STM32F10x特定的MCU平台中

RT-thread官方源码1.0.1的bsp目录中已经包含了STM32F10x平台的移植好的源码,

但却是以STM32F103ZE为平台构建的。如果需要移植到其它STM的MCU上,需要做以下几步:

1.解压官网的1.0.1源码;

2.修改晶振(官网的默认使用8M的外部晶振,我的板子是12M的):

第一步,打开stm32f10x.h,将

#define HSE_VALUE ((uint32_t)8000000) /*! Value of the External oscillator in Hz */

修改为:

#define HSE_VALUE ((uint32_t)12000000) /*! Value of the External oscillator in Hz */

第二步,打开system_stm32f10x.c,修改PLL参数,将

/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

RCC-CFGR = (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

RCC_CFGR_PLLMULL));

RCC-CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

修改为:

/* PLL configuration: PLLCLK = HSE * 6 = 72 MHz */

RCC-CFGR = (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

RCC_CFGR_PLLMULL));

RCC-CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);

第三步,打开你已经建立的STM32工程,选择Projects-〉Options for target ***,

找到Target标签,外接的晶振默认还是8MHz,将外接的晶振参数修改为12MHz.

3.修改board.h里的SRAM大小(官方的默认是64K):

#define STM32_SRAM_SIZE 20

#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)

4.修改led引脚;打开led.c文件:

#else

#define led1_rcc RCC_APB2Periph_GPIOE

#define led1_gpio GPIOE

#define led1_pin (GPIO_Pin_2)

#define led2_rcc RCC_APB2Periph_GPIOE

#define led2_gpio GPIOE

#define led2_pin (GPIO_Pin_3)

5.烧写运行,就能看到led闪烁了;

如果想进一步裁剪官方系统源码,可以参考rt-thread裁剪示例 位于wiki百科的-RT-Thread组件使用-其它。

2条大神的评论

  • avatar
    访客 2022-07-27 下午 05:57:41

    0x特定的MCU平台中RT-thread官方源码1.0.1的bsp目录中已经包含了STM32F10x平台的移植好的源码,但却是以STM32F103ZE为平台构建的。如果需要移植到其它STM的MCU上,需要做以下几步:1.解压官网的1.0.1源码

  • avatar
    访客 2022-07-27 下午 03:18:05

    好的源码,但却是以STM32F103ZE为平台构建的。如果需要移植到其它STM的MCU上,需要做以下几步:1.解压官网的1.0.1源码;2.修改晶振(官网的默认使用8M的外部晶振,我的板子是12M的): 第一步,打开stm32f10x.h,将

发表评论