Zstack中如何实现自己的任务(2)

2019-06-17 10:39

将没有中断相应,为1时每一个中断源的使能受相应的位的控制。上面的宏即是用芯片的EA=0来关中断实现临界资源的保护。

(2)set宏定义如下,表示执行x指令,注意x是一个完整的语句,需要加分号。

#define st(x) do { x } while (__LINE__ == -1)

而整个宏的定义结束时没有分号,而是在最后的应用时加的分号,如:HAL_ENTER_CRITICAL_SECTION(intState);

(3)HAL_ENABLE_INTERRUPTS()和HAL_DISABLE_INTERRUPTS()这两个宏分别实现了cc2430的所有中断的开和关。HAL_ENTER_CRITICAL_SECTION(x)宏首先将EA的值保存在变量x中,然后关闭所有中断,进行后面的临街资源处理。HAL_EXIT_CRITICAL_SECTION(x)宏则是回复刚才保存在x中的EA的值。

HAL_CRITICAL_STATEMENT(x)宏的功能是将x作为临界代码执行,首先声明了用于保存EA值的变量,然后调用进入临界区宏,执行临界代码x,最后执行退出临界区的宏。

(4)注意HAL_CRITICAL_STATEMENT(x)这个宏,因为st宏的实现中x是一些可以执行的完整c语句,更主要的是写在do{}while()中,它值一个子的程序片段,因此x可以做很多事,比如声明变量等。否则你会奇怪,这样定义宏在宏展开的时候如果使用多个这个宏,会不会出现重复定义(HAL_CRITICAL_STATEMENT(x) 实现代码中的halIntState_t s;),会不会出现在程序的中间来定义变量(c语言要求要使用的变量需在最前面定义)等问题。其实这些问题是不会出现的,真是因为HAL_CRITICAL_STATEMENT(x)的x的执行在do-while中的do子句中。

下面是一个类似的验证例子程序: #include

#define st(x) do{x}while(__LINE__==-1)

#define enable() st(EA = 1;) //使能所有中断 #define disable() st(EA = 0;) //关闭所有中断

#define enter(x) st(x = EA; disable();) //进入临界区 #define exit(x) st(EA = x;) //退出临界区 //简写临界代码的执行

#define critical(s) st(int temp; enter(temp); s; exit(temp);) //模拟控制所有中断的变量 int EA = 5; int main() {

int a;

enter(a);

printf(\ exit(a);

//验证多次执行宏不会出现重复定义变量的问题 critical(printf(\ critical(printf(\

//上面的critical(printf(\world-first\\n\展开后的等价代码

do {

int temp; do{

temp = EA;

do{ EA = 0; }while(__LINE__==-1); }while(__LINE__==-1); printf(\

do{ EA =temp; }while(__LINE__==-1); }while(__LINE__==-1);

//验证在子模块中可以再次声明变量 {

int a = 12;

printf(\ {

int a = 89;

printf(\ } }

return 0; }

执行结果为: EA=0, a=5

hello world-first hello world-second hello world 12 89

PS: (1)c程序中的各个宏定义的顺序任意。

(1)c程序中要求变量需先定义所有要使用的变量,然后才使用,是对用一个层次模块来说,在子层次中可以遵循这个规则再次定义变量。一个花括号中的括起来的内容{...}可以看作一个子模块。

Zstack设置发送功率(CC2530)

在mac_radio.c中找到macRadioSetTxPower函数,其具体内容复制如下:

#ifndef HAL_MAC_USE_REGISTER_POWER_VALUES

MAC_INTERNAL_API void macRadioSetTxPower(uint8 txPower) {

halIntState_t s;

#if defined MAC_RUNTIME_CC2591 || defined MAC_RUNTIME_CC2590 const uint8 CODE *pTable =

macRadioDefsTxPwrTables[macRadioDefsRefTableId >> 4]; #elif defined HAL_PA_LNA || defined HAL_PA_LNA_CC2590 const uint8 CODE *pTable = macRadioDefsTxPwrTables[0]; #else

const uint8 CODE *pTable = macRadioDefsTxPwrBare;

//该table中含有txPower的设置值,将该table的首地址赋给指针pTable, //macRadioDefsTxPwrBare[]定义在mac_radio_defs.c中 #endif

if ((int8)txPower >

(int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]) {

txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY];//发送功率上限值 }

else if ((int8)txPower <

(int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]) {

txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY];//发送功率下限值 }

HAL_ENTER_CRITICAL_SECTION(s); {

uint8 index = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY] - txPower

+ MAC_RADIO_DEFS_TBL_TXPWR_ENTRIES; reqTxPower = pTable[index]; }

//通过计算转换查表index,得到发送功率值,将其赋给reqTxPower, //函数macRadioUpdateTxPower中用于更新发送功率

HAL_EXIT_CRITICAL_SECTION(s);

macRadioUpdateTxPower(); } #else

MAC_INTERNAL_API void macRadioSetTxPower(uint8 txPower) {//直接获得reqTxPower halIntState_t s;

HAL_ENTER_CRITICAL_SECTION(s); reqTxPower = txPower;

HAL_EXIT_CRITICAL_SECTION(s);

macRadioUpdateTxPower(); }

下面了解一下macRadioUpdateTxPower函数,其函数体如下:

MAC_INTERNAL_API void macRadioUpdateTxPower(void) {

halIntState_t s;

HAL_ENTER_CRITICAL_SECTION(s);//进入临界区

if (reqTxPower != macPhyTxPower)//macPhyTxPower即为当前实际的发送功率 {

if (!macRxOutgoingAckFlag && !MAC_TX_IS_PHYSICALLY_ACTIVE()) //当有发送任务正在进行时,不能改变发送功率。

//当前的发送任务完成后,将重新调用该函数进行发送功率设置。 {

macPhyTxPower = reqTxPower;

MAC_RADIO_SET_TX_POWER(macPhyTxPower);//设置寄存器TXPOWER为macPhyTxPower,即reqTxPower }

}

HAL_EXIT_CRITICAL_SECTION(s);//离开临界区 }

通过上面的函数,我们根据自己的需要,适当对发送功率进行设置。

关于ZStack-CC2530-2.3.0-1.4.0中simpleApp例子的组网(一)

所有的C语言编写的程序,入口函数一定是main函数,首先看一下ZMain.c函数。

int main( void ) {

osal_int_disable( INTS_ALL ); HAL_BOARD_INIT(); zmain_vdd_check(); InitBoard( OB_COLD ); HalDriverInit(); osal_nv_init( NULL ); ZMacInit(); zmain_ext_addr(); zgInit(); #ifndef NONWK afInit(); #endif

osal_init_system();

osal_int_enable( INTS_ALL ); InitBoard( OB_READY );


Zstack中如何实现自己的任务(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:全国计算机等级考试二级VFP重点

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: