就绪状态的线程被调度器调度后进入运行状态(RT_THREAD_RUNNING); 当处于运行状态的线程调用rt_thread_delay(),rt_sem_take(),rt_mutex_take(),rt_mb_recv() 等函数或者获取不到资源时, 将进入到挂起状态(RT_THREAD_SUSPEND); 处于挂起状态的线程,如果等待超时依然未能获得资源或由于其他线程释放了资源,那么它...
rt_mutex_release rt_event_recv rt_mb_send_wait rt_mb_recv rt_mq_send_wait rt_mq_recv 线程操作类 登录后复制rt_thread_detach rt_thread_delete rt_thread_yield rt_thread_delay rt_thread_delay_until rt_thread_mdelay rt_thread_suspend rt_thread_resume 其它 登录后复制rt_tick_get rt_enter_c...
时,线程将主动挂起;当调用 rt_sem_take(),rt_mb_recv() 等函数时,资源不可使用也将导致线程挂起。处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其他线程释放掉该线程所等待的资源时,该线程也会返回到就绪状态。 rt_err_t rt_threa...
线程状态切换 线程通过调用函数 rt_thread_create/init() 进入到初始状态;初始状态的线程通过调用函数 rt_thread_startup() 进入到就绪状态;就绪状态的线程被调度器调度后进入运行状态,调用rt_thread_suspend()函数切换为挂起状态;当处于运行状态的线程调用 rt_sem_take(),rt_mutex_take(),rt_mb_recv() 等函数...
if (rt_mb_recv(ð_rx_thread_mb, (rt_ubase_t*)&device, RT_WAITING_FOREVER) == RT_EOK) { struct pbufp; /check link status/ if (device->link_changed) { int status; rt_uint32_t level; level = rt_hw_interrupt_disable(); ...
rt_err_t rt_mb_recv (rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout) 参数mb为邮箱的句柄;value为邮箱消息存储地址;timeout为等待超时时间。 接收成功,则返回RT_EOK;接收超时,则返回-RT_ETIMEOUT;接收失败,返回-RT_ERROR。
当这个线程调用 rt_thread delay 、rt_semtake、rt_mbrecv 等 系统函数时,将主动挂起或由于获取不到资源进入到挂起状态; 挂起状态的线程,如果它等待超时依然未获得资源或由于其他线程释放了资源,它将返回到就绪状态。当系统中有比当 前运行态线程优先级还要高的线程就绪时,当前线程将立刻被换出,高优先级线程抢占 ...
在上图中除了今天我们介绍的线程操作函数,还有一些函数还没有介绍过,比如rt_sem_take(),rt_mutex_take(),rt_mb_recv(),这是我们后期会介绍到的关于线程间通信的一些信号量,互斥量相关的函数。 作为对比,再来看看FreeRTOS 的任务状态: 3.4 系统线程
ret = rt_mb_recv(*mbox, (rt_uint32_t*)msg, RT_WAITING_FOREVER); } else { rt_tick_t timeout_ticks = timeout_ms; ret = rt_mb_recv(*mbox, (rt_uint32_t*)msg, timeout_ticks); if (ret != RT_EOK) { /* timed out */ ...
if(rt_mb_recv(key_mailbox,&keyvalue,RT_WAITING_FOREVER) == RT_EOK) { rt_kprintf("Key mailbox recv %0X.\n",keyvalue); switch((keyvalue &0xffff0000)>>16) { case 0x0: //key_m switch (keyvalue&0xffff) { case SINGLE_CLICK: switch(g_CurMenuIndex) { case 0: g_CurMenuIndex...