## OSTCBPrioTbl[prio] == (OS_TCB *)0与OSTCBPrioTbl[prio] == (OS_TCB *)1的理解 ##


OSTCBPrioTbl是一个指针数组。c语言定义一个未初始化的指针数组,指针指向哪里。
下面来仿真:


struct stuff{  
        char job[20];  
        int age;  
        float height;  
}; 
struct stuff  *demo[10];

仿真结果

指针数组指针都为0
看看下图
指针数组却有数据
demo数组里初始化指针指向0地址。


char test;
test=*(char*)(0x01);

这里写图片描述
这说名未初始化的数组 指向地址是0指针。
很多人可能对(OS_TCB )0,(OS_TCB )1不太了解。
下面解释一下。通俗的讲任一存储空间的任意地址我们不知道它的存储类型。相当于void指针。可以转换成任意指针类型。
下面举例子说明。
下图是存储空间对应的数据。
这里写图片描述


test1=(char*)(0x0800c001);//把地址0x0800c001转化成char类型指针。
test2=*(char*)(0x0800c001);//加个*指的是取0x0800c001存储空间地址的数据。

仿真结果
这里写图片描述

同样的道理


struct stuff{  
        char job[20];  
        int age;  
        float height;  
}; 
struct stuff  *demo[10];
struct stuff *test1;
struct stuff test2;

test1=(struct stuff*)(0x0800c001);
test2=*(struct stuff*)(0x0800c001);

这里写图片描述

所以

OS_ENTER_CRITICAL();
    if (OSIntNesting > 0u) {                
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_CREATE_ISR);
    }
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /*如果指的是0地址说明未初始化,此任务不存在。可以创建。*/
        OSTCBPrioTbl[prio] = (OS_TCB *)1;/* 
        通俗的讲  在OS_EXIT_CRITICAL(); 之后 就允许中断了 可能导致其它程序创建此优先级任务
        出,理论上讲创建任务期间是不能允许中断的,但是这样会导致临界时间很长,导致会丢失某些中断。所以作者在此让地址偏移一位,标志此任务已存在 */                                 
  OS_EXIT_CRITICAL();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值