RT-Thread学习笔记,创建线程及启动过程

一、RT-Thread 初始化函数

1.RT_thread 的初始化函数是:rt_hw_board_init();    可将外设初始化放在其中,这时候还未运行操作系统。

二、RT-Thread GPIO初始化函数

2.RT_thread 的GPIO初始化函数为:rt_pin_mode(GET_PIN(G, 13), PIN_MODE_OUTPUT);

三、RT_thread 创建静态线程的过程

1.  创建线程入口函数    (实现功能,可以定义为静态函数)
                    /*  创建线程函数  */
            static void led1_thread_entry(void* parameter)
            {
                while(1)
                {

                    rt_pin_write(LED1_PIN, PIN_HIGH);
                    rt_thread_delay(500);
                    rt_pin_write(LED1_PIN, PIN_LOW);
                    rt_thread_delay(500);

                }
            }
2.  定义线程堆栈大小和线程控制块
                        /*  定义线程控制块 */
                static struct rt_thread led1_thread;

                /* 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 */
                ALIGN(RT_ALIGN_SIZE)

                /* 定义线程栈 */
                static rt_uint8_t rt_led1_thread_stack[512];        (设置线程堆栈大小)
3.  创建静态线程
                /*****       创建线程函数               *******/

                    int create_led_thread(void)
                {

                        /*****       创建线程函数               *******/

                        rt_thread_init( &led1_thread,                 //线程控制块地址
                                        "LED1",                          //线程名字
                                        led1_thread_entry,               //线程入口函数
                                        RT_NULL,                         //线程入口参数
                                        &rt_led1_thread_stack[0],        //线程栈起始地址
                                        sizeof(rt_led1_thread_stack),    //线程栈大小
                                        3,                               //线程优先级
                                        20);                             //时间片参数

                        rt_thread_startup(&led1_thread);                 //创建完成就开始运行

                        return 1;
                }

四、RT-Thread创建动态线程

1.  创建线程入口函数    (实现功能,可以定义为静态函数)
                    /*  创建线程函数  */
            static void led1_thread_entry(void* parameter)
            {
                while(1)
                {

                    rt_pin_write(LED1_PIN, PIN_HIGH);
                    rt_thread_delay(500);
                    rt_pin_write(LED1_PIN, PIN_LOW);
                    rt_thread_delay(500);

                }
            }
2.  /*  定义线程控制块 */
  static rt_thread_t led1_thread = RT_NULL;
3.  创建动态线程
         int create_led2_thread(void)
         {
             led1_thread =                                       //返回线程创建标志
             rt_thread_create(   "LED1",                         //线程名字
                                 led1_thread_entry,              //线程入口函数
                                 RT_NULL,                        //线程入口参数
                                 512,                            //线程堆栈大小
                                 3,                              //线程优先级
                                 20);                            //时间片参数


             if(led1_thread != RT_NULL)                          //如果线程创建成功开始运行
                 rt_thread_startup(led1_thread);
             else
                 return -1;
         }       

对比:创建动态线程不用 程序员建立堆栈,只需要规定堆栈大小即可,而且程序控制块不再是结构体,而是个变量,

可调用函数 MSH_CMD_EXPORT(线程创建函数名, MSH命令行中的名字); 将线程加入命令行中

五、RT_thread 时间片参数

当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。 这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。 如果同一个优先级下只有一个线程,那么时间片这个形参就不起作用。

六、RT-Thread线程启动方式

  1. 调用函数 rt_thread_startup(线程控制块变量);

七、__CC_ARM编译环境下的 S u b Sub Sub$ 与 S u p e r Super Super $ 功能

1.在BOOT里会首先跳转到__main函数,
2.如果使用了$Sub$$main 函数将首先跳转到abc这个函数去运行,做一些初始化
3.$Super$ $mian 可以直接跳转到 正规的main函数,

Exmple:首先跳转到Sub$$main ,然后再通过Super$$跳转到 main
    
    int $Sub$$main(void)
    {
        //添加补丁函数
    
        $Super$$main(); //使用本句直接转到main()运行
    }

总结: $Sub$$main  跳出; $Super$ $mian  跳回main

你可能感兴趣的:(笔记,stm32,rtos)