全面解析腾讯最新开源 loT 操作系统 TencentOS tiny!

作者 | 马超
责编 | 胡巍巍
出品 | CSDN(ID:CSDNnews)





typedef struct k_mutex_st {
pend_obj_t pend_obj;//pendding obj的列表
k_nesting_t pend_nesting;//个数
k_task_t *owner;//现在所的拥有者
k_prio_t owner_orig_prio; //现在所的拥有者
k_list_t owner_list;
} k_mutex_t;
下面我们主要对于其pend操作函数进行解读如下:
__API__ k_err_t tos_mutex_pend_timed(k_mutex_t *mutex, k_tick_t timeout)
{
TOS_CPU_CPSR_ALLOC();
k_err_t err;
TOS_PTR_SANITY_CHECK(mutex);
TOS_IN_IRQ_CHECK();
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!pend_object_verify(&mutex->pend_obj, PEND_TYPE_MUTEX)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_CPU_INT_DISABLE();//将CPU锁住,防止其它进程进入
if (mutex->pend_nesting == (k_nesting_t)0u) { //没有等待
mutex_fresh_owner_mark(mutex, k_curr_task);//将此mutex的owner置 为当前task
TOS_CPU_INT_ENABLE();//将CPU解锁
return K_ERR_NONE;//返回成功
}
if (knl_is_self(mutex->owner)) {
if (mutex->pend_nesting == (k_nesting_t)-1) {//等待数量如果超限则返回overflow
TOS_CPU_INT_ENABLE();
return K_ERR_MUTEX_NESTING_OVERFLOW;
}
++mutex->pend_nesting;
TOS_CPU_INT_ENABLE();
return K_ERR_MUTEX_NESTING;
}
if (timeout == TOS_TIME_NOWAIT) { //如果锁已经被占用超时时间为不等待,则直接返回
TOS_CPU_INT_ENABLE();
return K_ERR_PEND_NOWAIT;
}
if (knl_is_sched_locked()) {//如果任务被锁定,则直接返回
TOS_CPU_INT_ENABLE();
return K_ERR_PEND_SCHED_LOCKED;
}
if (mutex->owner->prio > k_curr_task->prio) {
tos_task_prio_change(mutex->owner, k_curr_task->prio);//如果owner的优先级更低,也就是其数值更大,则调整优先级
}
pend_task_block(k_curr_task, &mutex->pend_obj, timeout);//阻塞pending的任务
TOS_CPU_INT_ENABLE();//解锁CPU总线
knl_sched();//解锁任务高度
err = pend_state2errno(k_curr_task->pend_state);
if (err == K_ERR_NONE) {//如果没有错误
TOS_CPU_INT_DISABLE();
mutex_new_owner_mark(mutex, k_curr_task);//刷新mutex当前的owner
TOS_CPU_INT_ENABLE();
}
return err;
}

typedef struct k_sem_st {
pend_obj_t pend_obj;//pending的列表
k_sem_cnt_t count;//关键资源的数量
} k_sem_t;
__STATIC__ k_err_t sem_do_post(k_sem_t *sem, opt_post_t opt)
{
TOS_CPU_CPSR_ALLOC();//为CPU的CPSR进行预分配为后面恢复做准备
TOS_PTR_SANITY_CHECK(sem);
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
if (!pend_object_verify(&sem->pend_obj, PEND_TYPE_SEM)) {
return K_ERR_OBJ_INVALID;
}
#endif
TOS_CPU_INT_DISABLE();//CPU锁定防止其它进程入
if (sem->count == (k_sem_cnt_t)-1) {//若资源数量为-1则返回超限
TOS_CPU_INT_ENABLE();
return K_ERR_SEM_OVERFLOW;
}
if (pend_is_nopending(&sem->pend_obj)) {//如果无pending的情况则直接返回
++sem->count;
TOS_CPU_INT_ENABLE();
return K_ERR_NONE;
}
pend_wakeup(&sem->pend_obj, PEND_STATE_POST, opt);//唤醒pending的进程
TOS_CPU_INT_ENABLE();//恢复CPU
knl_sched();//恢复任务调度
return K_ERR_NONE;
}




热 文 推 荐
☞谷歌称已实现量子霸权;iOS 捷径功能被诉侵权;Chrome 78 Beta 发布 | 极客头条
点击阅读原文,即刻阅读《程序员大本营》最新期刊。

关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 博物馆的“千面新生” 7904027
- 2 病重男孩与全班拍毕业照次日离世 7809486
- 3 印度卫星发射失败:掌声刚停就下坠 7713623
- 4 6组数据透视中国市场强大吸引力 7618176
- 5 这是一张3000年前商朝王子的请假条 7523749
- 6 女生突发脑出血 症状是不会说英语 7424230
- 7 “谭木匠”940名员工有341人为残疾 7334159
- 8 男子遇夜跑大熊猫一开始以为是猪 7237375
- 9 数次地震不倒 联合国点赞中国黑科技 7135313
- 10 茅台股东大会前夜晚宴 茅台变蓝莓汁 7045480