在RT_Thread中可以使用语句rt_thread_create()来创建一个线程,经过测试如果上一个创建的线程还没结束再次创建启动便会再次创建一个同样的线程,过多的创建会占用过多内存甚至导致系统不稳定,因此如果线程只需要同时运行单个,在每次创建时候关闭上次线程是必要的。
void find_zeropoint1_entry(void *param){
pos_t lim;
int speed1_n;
find_zeropoint_flag = 1;
speed1_n = speed1;
speed1 = 12;
lim.a = -120000;
lim.b = encoder2_num();
go_to_position(&lim);
while(1){
rt_thread_mdelay(500);
if(!rt_pin_read(motor1_dir)||find_zeropoint1_thread_running){
break;
}
}
set_zero1();
speed1 = speed1_n;
find_zeropoint_flag = 0;
find_zeropoint1_thread_running = RT_FALSE;
find_zeropoint1_thread = RT_NULL;
}
void find_zeropoint1(void){
if (find_zeropoint1_thread != RT_NULL) {
find_zeropoint1_thread_running = RT_TRUE;
}
else{
find_zeropoint1_thread = rt_thread_create("find_zero_point1", find_zeropoint1_entry, RT_NULL, 512, 10, 5);
rt_thread_startup(find_zeropoint1_thread);
}
}
这是一个回零点的例程,如果在同一时间内运行多个会导致电机运行混乱。因此在每次调用的时候判断线程是否为空再启动。不为空则通过全局变量通知线程结束,线程结束时把改全局变量关闭并且把线程设置NULL,经测试线程结束之后并不会自动将它设置为null一定要手动设置。这样可以安全的结束线程。
不建议使用rt_thread_delete()函数,强行结束线程有时会导致崩溃。
如果线程被创建后重复启动也会导致崩溃,每次启动前一定要判断。