嵌入式操作系统内核原理和开发(信号量)

发表于:2012-9-14 09:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:feixiaoxing    来源:51Testing软件测试网采编

  有了上面的讲解,我们发现os的代码其实也没有那么恐怖。所以,请大家一鼓作气,看看信号量是怎么删除的吧,

RAW_U16 raw_semaphore_delete(RAW_SEMAPHORE *semaphore_ptr)
{
 LIST *block_list_head;
 
 RAW_SR_ALLOC();

 #if (RAW_SEMA_FUNCTION_CHECK > 0)
 
 if (semaphore_ptr == 0) {
  
  return RAW_NULL_OBJECT;
 }
 
 #endif

 block_list_head = &semaphore_ptr->common_block_obj.block_list;
 
 RAW_CRITICAL_ENTER();

 /*All task blocked on this queue is waken up*/
 while (!is_list_empty(block_list_head)) {
  delete_pend_obj(list_entry(block_list_head->next, RAW_TASK_OBJ, task_list)); 
 }                            

 RAW_CRITICAL_EXIT();
 raw_sched();
 return RAW_SUCCESS;
}

  信号量删除的工作其实很少,也很简单,同样我们也来梳理一下,

  (1)判断参数合法性;

  (2)唤醒阻塞队列中的每一个线程;

  (3)调用系统调度函数,因为高优先级的任务很有可能刚刚从阻塞队列中释放出来;

  (4)当前线程再次运行,函数返回。

  通过上面几个函数的讲解,我们发现关于os互斥部分的代码其实也不复杂。只要对系统本身和中断有一些了解,其实代码都是可以看懂的。当然,上面的代码我们还是讲的比较粗糙,所以有些细节还是要补充一下,

  (1)多线程共享的函数必须在关中断的情况下进行操作,当然多核的时候关中断也不好使了;

  (2)实时系统的抢占是每时每刻都在进行的,比如中断返回时、信号量释放时、调用延时函数、调用调度函数的时候,所以大家心中要有抢占的概念;

  (3)互斥函数中大量使用了链表的结构,建议大家好好掌握链表的相关算法;

  (4)关于os的代码一定要多看、多思考、多练习才会有进步和提高,纸上得来终觉浅、绝知此事要躬行。

相关链接:

嵌入式操作系统内核原理和开发(开篇)

嵌入式操作系统内核原理和开发(cpu的那些事)

嵌入式操作系统内核原理和开发(中断)

嵌入式操作系统内核原理和开发(地址空间)

嵌入式操作系统内核原理和开发(系统中断仿真)

嵌入式操作系统内核原理和开发(线程切换)

嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)

嵌入式操作系统内核原理和开发(多线程轮转)

嵌入式操作系统内核原理和开发(通用优先级调度)

嵌入式操作系统内核原理和开发(抢占式优先级调度)

嵌入式操作系统内核原理和开发(头文件调整)

嵌入式操作系统内核原理和开发(内存分配算法)

嵌入式操作系统内核原理和开发(固定内存分配算法)

嵌入式操作系统内核原理和开发(基于链表节点的内存分配算法)

嵌入式操作系统内核原理和开发(最快、最优、最差内存分配算法)

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号