STM32 学习之 RT-Thread 创建进程错误

  1. 为了方便管理,新建了一个函数,将进程的栈,线程名,优先级,还有入口函数,以参数的形式预留了出来

    struct rt_thread tid_thread[4];
rt_uint8_t create_thread(const char       *name,
                        void (*entry)(void *parameter),
                        void             *stack_start,
                        rt_uint8_t        priority)
{
    rt_err_t rt_err;
    rt_thread_t tmp_tid_thread = tid_thread;

    // 创建按键线程
    rt_err = rt_thread_init(tmp_tid_thread,            //线程控制块
                   name,                            //线程名字,在shell里面可以看到
                   entry,                           //线程入口函数
                   RT_NULL,                         //线程入口函数参数
                   stack_start,                 //线程栈起始地址
                   sizeof(stack_start),             //线程栈大小
                   priority,                        //线程的优先级
                   20);                             //线程时间片
    if(rt_err == RT_EOK)
    {
        rt_kprintf("Thread %s init seccess!", name);
        rt_thread_startup(tmp_tid_thread);             //启动线程key_thread,开启调度
        tmp_tid_thread++;
    }
    else
    {
        rt_kprintf("Thread %s init failed!", name);
    }
    return rt_err;
}

2.在新建进程的时候,在进程的栈,线程名,优先级,还有入口函数都声明好的情况下,调用这个函数,结果每次第一个进程一初始化成功,就会进入Hard Fault 中断。

create_thread("key", key_thread_entry, &rt_key_thread_stack[0], 3 ); //按键进程

报错信息

 \ | /
- RT -     Thread Operating System
 / | \     2.1.0 build Sep 13 2018
 2006 - 2017 Copyright by rt-thread team
psr: 0x21000000
r00: 0x20001b90
r01: 0x10000000
r02: 0xf0000000
r03: 0x00000020
r04: 0xdeadbf33
r05: 0x00000000
r06: 0xdeadbeef
r07: 0xdeadbeef
r08: 0xdeadbeef
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x0000000a
 lr: 0x0800291b
 pc: 0x0800291a
hard fault on thread: key

3.后来决定用教程中的方法老老实实的建立静态线程,虽然成功了,但是由于所有的进程使用的 句柄都是同一个,又出了问题


    // 创建按键线程
    rt_err = rt_thread_init(&tid_thread,            //线程控制块
                   "key",                           //线程名字,在shell里面可以看到
                   key_thread_entry,                //线程入口函数
                   RT_NULL,                         //线程入口函数参数
                   &rt_key_thread_stack[0],         //线程栈起始地址
                   sizeof(rt_key_thread_stack),     //线程栈大小
                   1,                               //线程的优先级
                   20);                             //线程时间片
    rt_app_stratup("key", &tid_thread, rt_err);
    // 创建按键线程
    rt_err = rt_thread_init(&tid_thread,            //线程控制块
                   "lcd",                           //线程名字,在shell里面可以看到
                   lcd_thread_entry,                //线程入口函数
                   RT_NULL,                         //线程入口函数参数
                   &rt_lcd_thread_stack[0],         //线程栈起始地址
                   sizeof(rt_lcd_thread_stack),     //线程栈大小
                   2,                               //线程的优先级
                   20);                             //线程时间片
    rt_app_stratup("lcd", &tid_thread, rt_err);

信息

(thread->stat == RT_THREAD_SUSPEND) assertion failed at function:rt_thread_timeout, line number:708

最后为每个进程都分配一个独有的 静态 控制块,就OK 了

static struct rt_thread tid_thread_key;//线程控制块
static struct rt_thread tid_thread_iwdg;//线程控制块
static struct rt_thread tid_thread_lcd;//线程控制块
static struct rt_thread tid_thread_beep;//线程控制块

// 创建按键线程
rt_err = rt_thread_init(&tid_thread_key,            //线程控制块
               "key",                           //线程名字,在shell里面可以看到
               key_thread_entry,                //线程入口函数
               RT_NULL,                         //线程入口函数参数
               &rt_key_thread_stack[0],         //线程栈起始地址
               sizeof(rt_key_thread_stack),     //线程栈大小
               1,                               //线程的优先级
               20);                             //线程时间片
rt_app_stratup("key", &tid_thread_key, rt_err);
// 创建按键线程
rt_err = rt_thread_init(&tid_thread_lcd,            //线程控制块
               "lcd",                           //线程名字,在shell里面可以看到
               lcd_thread_entry,                //线程入口函数
               RT_NULL,                         //线程入口函数参数
               &rt_lcd_thread_stack[0],         //线程栈起始地址
               sizeof(rt_lcd_thread_stack),     //线程栈大小
               2,                               //线程的优先级
               20);                             //线程时间片
rt_app_stratup("lcd", &tid_thread_lcd, rt_err);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章