10033|9

86

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ucos学习之OSSemCreate()函数分析 [复制链接]

 小弟初学ucos,如下是这个函数的源代码,小弟有些不懂,恳请大神指教~~~
OS_EVENT  *OSSemCreate (INT16U cnt)
{
    OS_EVENT  *pevent;
#if OS_CRITICAL_METHOD == 3                             
    OS_CPU_SR  cpu_sr = 0;
#endif

    if (OSIntNesting > 0) {              /*问题1:这段代码的作用是什么???*/          
        return ((OS_EVENT *)0);                          
    }
    OS_ENTER_CRITICAL();
    pevent = OSEventFreeList;                             
    if (OSEventFreeList != (OS_EVENT *)0) {        /*问题2:如何理解 OSEventFreeList != (OS_EVENT *)0 */     
                                                                          /* 假如定义了一个类型A,一个A类型的指针P 那么P=(A*)0表示什么意思??? */
        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
    }
    OS_EXIT_CRITICAL();
    if (pevent != (OS_EVENT *)0) {                       
        pevent->OSEventType    = OS_EVENT_TYPE_SEM;
        pevent->OSEventCnt     = cnt;                  
        pevent->OSEventPtr     = (void *)0;            
#if OS_EVENT_NAME_SIZE > 1
        pevent->OSEventName[0] = '?';                  
        pevent->OSEventName[1] = OS_ASCII_NUL;
#endif
        OS_EventWaitListInit(pevent);                    
    }
    return (pevent);
}

最新回复

我在VS中试过: A *P; P=0;/*不会报错,0被隐式装换成了(A*)类型*/ 但可能在其他编译器里就没这么顺利了,为了保险起见将0显式装换成需要的类型比如:(A*)0; 反正记住一点,在用到空指针的时候,显式转换成你需要的类型是没有错的。  详情 回复 发表于 2015-8-3 16:22
点赞 关注
 

回复
举报

109

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
问题一 中断服务程序中不能创建信号量
问题二 当前事件块被创建 没有用到的控制块需要指针向前移动   if (OSEventFreeList != (OS_EVENT *)0)用来判断是否事件块已被用完
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
感谢大神~~~
如问题2,其实这是个C语言问题(原谅小弟C语言知识不扎实~~~)
假如定义了一个类型A,一个A类型的指针P 那么P=(A*)0表示什么意思???
PS:一个指针P,它指向0表示什么意思呢???恳请大神指教~~~

点评

指针未指向任何内存空间等同于NULL  详情 回复 发表于 2015-7-6 15:00
 
 
 

回复

109

帖子

1

TA的资源

一粒金砂(中级)

4
 
liuchang--- 发表于 2015-7-6 14:42
感谢大神~~~
如问题2,其实这是个C语言问题(原谅小弟C语言知识不扎实~~~)
假如定义了一个类型A,一个A ...

指针未指向任何内存空间等同于NULL
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

5
 
一个A类型的指针P 那么P=(A*)0
如果是理解成NULL的话,为什么还要使用(A*)0呢?这个指针类型(A*)不就没有任何意义了吗?
小弟因为没太理解,所以有点啰嗦,恳请大神谅解~~~
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

6
 
还有一个问题: OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr
请问大神:这个(OS_EVENT *)是用来修饰OSEventFreeList还是用来修饰OSEventPtr的?
 
 
 

回复

109

帖子

1

TA的资源

一粒金砂(中级)

7
 
OS_EVENT是个结构体 建议你读一下邵贝贝翻译的原著
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 
liuchang--- 发表于 2015-7-6 15:26
还有一个问题: OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr
请问大神:这个(OS_EVENT *) ...

是用来修饰OSEventPtr的,因为:
void *OSEventPtr;                      /*  OSEventPtr的类型是void*  */
OS_EVENT *OSEventFreeList;   /* OSEventFreeList的类型是OS_EVENT *  */
如果不用 (OS_EVENT *):
OSEventFreeList = OSEventFreeList->OSEventPtr;/*错误:类型不匹配*/
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
liuchang--- 发表于 2015-7-6 15:23
一个A类型的指针P 那么P=(A*)0
如果是理解成NULL的话,为什么还要使用(A*)0呢?这个指针类型(A*)不就没 ...

我在VS中试过:
A *P;
P=0;/*不会报错,0被隐式装换成了(A*)类型*/
但可能在其他编译器里就没这么顺利了,为了保险起见将0显式装换成需要的类型比如:(A*)0;
反正记住一点,在用到空指针的时候,显式转换成你需要的类型是没有错的。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

10
 
感谢大神指教~~~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表