OS_CORE.C(1)
第一个函数(获得信号量、互斥量、邮箱或者队列名字的函数)的流程图和分析图如下所示:
/*$PAGE*/
/*
*********************************************************************************************************
* GET THE NAME OF A SEMAPHORE, MUTEX, MAILBOX or QUEUE
* 获得信号量、互斥量、邮箱或队列的名称
* Description: This function is used to obtain the name assigned to a semaphore, mutex, mailbox or queue.
*该功能用来获得信号量、互斥量、邮箱或者队列的名称
* Arguments : pevent is a pointer to the event group. 'pevent' can point either to a semaphore,
* 参数 a mutex, a mailbox or a queue. Where this function is concerned, the actual
* type is irrelevant.
* pevent是一个指向事件组的指针,也可以指向信号量、互斥量、邮箱或队列。在功能方面,实际的类型无关
* pname is a pointer to a pointer to an ASCII string that will receive the name of the semaphore,
* mutex, mailbox or queue.
* pname是一个指向代表信号量、互斥量、邮箱或队列名称的ASCII码字符串的指针
* perr is a pointer to an error code that can contain one of the following values:
* perr是一个指向错误码的指针。错误码包括以下几种:
* OS_ERR_NONE if the name was copied to 'pname' --名字被复制到pname,无错误
* OS_ERR_EVENT_TYPE if 'pevent' is not pointing to the proper event
* control block type. --pevent指向的事件控制块(ECB)类型错误
* OS_ERR_PNAME_NULL You passed a NULL pointer for 'pname'--pname指针为空
* OS_ERR_PEVENT_NULL if you passed a NULL pointer for 'pevent'--pevent指针为空指针
* OS_ERR_NAME_GET_ISR if you are trying to call this function from an ISR --调用中断函数
*
* Returns : The length of the string or 0 if the 'pevent' is a NULL pointer.
返回值:当pevent不是空指针时返回0或者字符串长度
*********************************************************************************************************
*/#if (OS_EVENT_EN) && (OS_EVENT_NAME_EN > 0u) /*如果可以产生事件并且可以给事件命名*/
INT8U OSEventNameGet(OS_EVENT *pevent, /*获得时间名称函数(指向事件组的指针,事件名称,错误码指针)*/INT8U **pname, INT8U *perr)
{INT8U len;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register 中断类型为3,断点*/OS_CPU_SR cpu_sr = 0u;
#endif#ifdef OS_SAFETY_CRITICAL /*定义安全中断*/if (perr == (INT8U *)0) { /*如果错误码为0.调用安全中断异常函数OS_SAFETY_CRITICAL_EXCEPTION()*/OS_SAFETY_CRITICAL_EXCEPTION();}
#endif#if OS_ARG_CHK_EN > 0u /*检查参数*/if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? 如果指向事件的指针为空 */*perr = OS_ERR_PEVENT_NULL; /*将错误码指针设为OS_ERR_PEVENT_NULL*/return (0u); }if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? 如果pname为空指针 */*perr = OS_ERR_PNAME_NULL; /*将错误码指针设为OS_ERR_PNAME_NULL*/return (0u);}
#endifif (OSIntNesting > 0u) { /* See if trying to call from an ISR 如果嵌套中断>0,即检测是否要调用中断函数*/*perr = OS_ERR_NAME_GET_ISR; /*将错误码指针设为 OS_ERR_NAME_GET_ISR*/return (0u);}switch (pevent->OSEventType) { /*如果pevent指向的是事件类型*/case OS_EVENT_TYPE_SEM: /*OS_EVENT_TYPE_SEM,OS_EVENT_TYPE_MUTEX,OS_EVENT_TYPE_MBOX,OS_EVENT_TYPE_Q四个+*/case OS_EVENT_TYPE_MUTEX: /*+事件类型处理为空*/case OS_EVENT_TYPE_MBOX:case OS_EVENT_TYPE_Q:break;default: /*默认情况下,将错误码设置成OS_ERR_EVENT_TYPE*/*perr = OS_ERR_EVENT_TYPE;return (0u);}//====以上是各种if下的情况,下面是该函数主体===//OS_ENTER_CRITICAL(); /*关中断*/*pname = pevent->OSEventName; /*将事件名字赋给pname指针*/len = OS_StrLen(*pname); /*得到名字的长度len*/OS_EXIT_CRITICAL(); /*开中断*/*perr = OS_ERR_NONE; /*将错误码设置为OS_ERR_NONE,即无错误*/return (len); /*返回len*/
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* ASSIGN A NAME TO A SEMAPHORE, MUTEX, MAILBOX or QUEUE
* 给信号量、互斥量、邮箱或队列设置名字
* Description: This function assigns a name to a semaphore, mutex, mailbox or queue.
*描述:该功能是给信号量、互斥量、邮箱或队列设置名字
* Arguments : pevent is a pointer to the event group. 'pevent' can point either to a semaphore,
* a mutex, a mailbox or a queue. Where this function is concerned, it doesn't
* matter the actual type.
* pervent是指向事件组的指针,也可以指向信号量、互斥量、邮箱或队列。
* pname is a pointer to an ASCII string that will be used as the name of the semaphore,
* mutex, mailbox or queue.
* pname是一个指向代表信号量、互斥量、邮箱或队列名称的ASCII码字符串的指针
* perr is a pointer to an error code that can contain one of the following values:
* perr是一个指向错误码的指针。错误码包括以下几种:
* OS_ERR_NONE if the requested task is resumed--所请求的任务是恢复
* OS_ERR_EVENT_TYPE if 'pevent' is not pointing to the proper event
* control block type.--pevent没有正确指向事件控制块类型
* OS_ERR_PNAME_NULL You passed a NULL pointer for 'pname'--pname指针为空
* OS_ERR_PEVENT_NULL if you passed a NULL pointer for 'pevent'--pevent为空指针
* OS_ERR_NAME_SET_ISR if you called this function from an ISR--中断
*
* Returns : None--无返回值
*********************************************************************************************************
*/#if (OS_EVENT_EN) && (OS_EVENT_NAME_EN > 0u) /*如果可以生成时间并且可以设置名称*/
void OSEventNameSet(OS_EVENT *pevent, /*调用设置名称函数(指向事件组的指针,指向名称的指针,指向错误码的指针)*/INT8U *pname,INT8U *perr)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register 将中断类型设置为3 */OS_CPU_SR cpu_sr = 0u;
#endif#ifdef OS_SAFETY_CRITICAL /*定义安全中断*/if (perr == (INT8U *)0) { /*如果错误码为0*/OS_SAFETY_CRITICAL_EXCEPTION(); /*调用安全中断异常函数OS_SAFETY_CRITICAL_EXCEPTION()*/}
#endif#if OS_ARG_CHK_EN > 0u /*检查参数*/if (pevent == (OS_EVENT *)0) { /* Is 'pevent' a NULL pointer? --pevent是空指针么? */*perr = OS_ERR_PEVENT_NULL; /*将错误码设为OS_ERR_PEVENT_NULL*/return; /*无返回值*/}if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? --pname是空指针么? */*perr = OS_ERR_PNAME_NULL; /*将错误码设为OS_ERR_PNAME_NULL*/return; /*无返回值*/}
#endifif (OSIntNesting > 0u) { /* See if trying to call from an ISR 检查是否要进行中断 */*perr = OS_ERR_NAME_SET_ISR; /*将错误码设为OS_ERR_NAME_SET_ISR*/return; /*无返回值*/}switch (pevent->OSEventType) {case OS_EVENT_TYPE_SEM:case OS_EVENT_TYPE_MUTEX:case OS_EVENT_TYPE_MBOX:case OS_EVENT_TYPE_Q:break;default:*perr = OS_ERR_EVENT_TYPE;return;}OS_ENTER_CRITICAL(); /*关中断*/pevent->OSEventName = pname; /*设置名称*/OS_EXIT_CRITICAL(); /*开中断*/*perr = OS_ERR_NONE; /*将错误码设置为OS_ERR_NONE*/
}
#endif
OS_CORE.C(1)相关推荐
- OS_CORE.C(11)
OS_SchedNew(void)找到将要运行的最高优先级任务函数 和任务调度函数OS_Sched(void): /* **************************************** ...
- OS_CORE.C(10)
今天看os_core.c文件中的各种初始化函数. OS_EventWaitListInit(OS_EVENT *pevent)初始化事件控制块的等待列表: /*$PAGE*/ /*2018/2/8 * ...
- OS_CORE.C(总结)
在内核的功能模块中,重点函数为: static void OS_InitEventList(void);/*初始化事件列表*/ static void OS_InitMisc(void);/* ...
- OS_CORE.C(9)
本篇介绍以下几个函数: OSVersion()获得版本号函数. OS_Dummy()虚拟函数. OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U ...
- OS_CORE.C(8)
本篇介绍的是OSStart()函数和OSStatInit()函数和OSTimeTick()函数. OSStart()多任务开始函数: /*$PAGE*/ /* ******************** ...
- OS_CORE.C(6)
先介绍一下优先级反转的相关知识: 优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证. 例 ...
- OS_CORE.C(5)
/*$PAGE*/ /* *************************************************************************************** ...
- OS_CORE.C(3)
OSTCBCur->OSTCBStat |= events_stat | /* Resource not available, ...无法获得资源的话就将其挂起 */OS_STAT_MULTI; ...
- OS_CORE.C(7)
本篇介绍的是调度器的上锁和解锁: 调度器上锁函数OSSchedlock()的功能是用于禁止任务调度,使任务保持对CPU的控制权. 调度器开锁函数OSSchedUnlock()的功能是解除对任务调度的禁 ...
最新文章
- 在 Linux 系统中安装Load Generator ,并在windows 调用
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
- 操作系统上机作业--使用系统调用实现mycp
- 谷歌返华或联手腾讯;华为否认5G专利收费;滴滴外挂让车费翻倍 | 极客头条...
- Delphi中Chrome Chromium、Cef3学习笔记(三)
- 华栖云科技图形图像视音频算法岗面试经验
- 25.Linux/Unix 系统编程手册(上) -- 进程的终止
- ConcurrentHashMap(JDK1.8)的源码解析
- vivo解bl锁_黔隆科技刷机教程酷派Y82820忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
- Devart Excel Addins 2.5.660 插件 Crack
- 解决:视频中有噪声(电流声)怎么办的问题(简单实用高效的视频降噪方法)
- Linux的触屏手势软件安装,linux触摸板手势
- 2019年新一年目标
- vue3+ts+vite,使用高德api实现搜索城市展示在地图上
- tf.transpose()
- 经纬度转换XY坐标,并计算距离
- 解决Error: EPERM: operation not permitted, mkdir
- Verilog——Chipscope简单实用的使用方法(基于ISE14.7 )
- C# 成员默认访问权限(public、private、protected、internal)
- N-炔丙基马来酰亚胺N-Propargylmaleimide,Propargyl-Maleimide,209395-32-4能够简单有效地将末端炔基并入抗体、含半胱氨酸的肽或其他含硫醇的分子