OSTCBPrioTbl是一个指针数组。c语言定义一个未初始化的指针数组,指针指向哪里。
下面来仿真:
struct stuff{
char job[20];
int age;
float height;
};
struct stuff *demo[10];
仿真结果
看看下图
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();