- 为了方便管理,新建了一个函数,将进程的栈,线程名,优先级,还有入口函数,以参数的形式预留了出来
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);