文章目录:
- 1、Java线程Thread.class源码中未找到线程状态切换的地方,请教各位大神,threadStatus切换源代码在哪里找?
- 2、java Thread源代码sleep函数,有一点看不懂,求解。
- 3、如何移植RT-thread官方的系统源码到STM32F10x特定的MCU平台中
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组件使用-其它。
0x特定的MCU平台中RT-thread官方源码1.0.1的bsp目录中已经包含了STM32F10x平台的移植好的源码,但却是以STM32F103ZE为平台构建的。如果需要移植到其它STM的MCU上,需要做以下几步:1.解压官网的1.0.1源码
好的源码,但却是以STM32F103ZE为平台构建的。如果需要移植到其它STM的MCU上,需要做以下几步:1.解压官网的1.0.1源码;2.修改晶振(官网的默认使用8M的外部晶振,我的板子是12M的): 第一步,打开stm32f10x.h,将