全面解析腾讯最新开源 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 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675








CSDN
