本文主要是介绍## 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];
仿真结果
看看下图
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();
这篇关于## OSTCBPrioTbl[prio] == (OS_TCB *)0与OSTCBPrioTbl[prio] == (OS_TCB *)1的理解 ##的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!