按键部分及系统调用时钟的分析
因为我的开发板没有DB的joystick,只有三个可用的独立按键,所以必须对Z-Stack中的按键部分的代码做比较多的修改。修改过程中我们可以看到Zstack对按键的处理,可以更深入地理解协议栈的实现。我首先把代码中关于SW5和SW6的部分全部注释掉了,然后自己声明了一些宏定义。我们主要来看一下函数部分的实现和执行流程。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
//按键初始化部分,设置端口状态,初始化标志变量
void HalKeyInit( void )
{
#if (HAL_KEY == TRUE)
/* Initialize previous key to 0 */
halKeySavedKeys = 0;
//因为我在前面已经注释掉了HAL_KEY_SW_6_ENABLE和HAL_KEY_SW_5_ENABLE,所以下面部分代码不执行
#if defined (HAL_KEY_SW_6_ENABLE)
HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT); /* Set pin direction to Input */
#endif
#if defined (HAL_KEY_SW_5_ENABLE)
HAL_KEY_SW_5_SEL &= ~(HAL_KEY_SW_5_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_5_DIR &= ~(HAL_KEY_SW_5_BIT); /* Set pin direction to Input */
HAL_KEY_SW_5_INP |= HAL_KEY_SW_5_BIT; /* Set pin input mode to tri-state */
#endif
//这里是我加的,主要是设置按键链接的IO为通用IO,输入状态
HAL_KEY_SW_SEL &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);
/*设置管脚功能为GPIO*/
HAL_KEY_SW_DIR &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);
/*设置管脚为输入*/
//---------------------------------------
/* Initialize callback function */
pHalKeyProcessFunction = NULL;
/* Start with key is not configured */
HalKeyConfigured = FALSE;
#endif /* HAL_KEY */
}
//按键配置,根据是否采用中断方式响应按键来进行不同的配置。这里把不相干的部分省略了
void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)
{
#if (HAL_KEY == TRUE)
/* Enable/Disable Interrupt or */
Hal_KeyIntEnable = interruptEnable;
/* Register the callback fucntion */
pHalKeyProcessFunction = cback;
//上面将传进来的参数送给局部变量,这样可以保护参数,嗯,学习!
/* Determine if interrupt is enable or not */
if (Hal_KeyIntEnable)
{
//打开中断允许,清除相关的中断标志
HAL_KEY_SW_PXIF = 0; /*清除P1全局中断*/
HAL_KEY_SW_PXIFG = ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);
/*清除按键1,2,3端口的中断标志*/
HAL_KEY_SW_IEN |= (HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);
/*允许各按键的中断*/
HAL_KEY_SW_GLOBAL_IEN |= HAL_KEY_SW_IENBIT; /*允许P1中断*/
/* Do this only after the hal_key is configured - to work with sleep stuff */
if (HalKeyConfigured == TRUE)
{//第一次配置按键是不会进入到这里执行的,必须配置过一次以后将标志HalKeyConfigured置位才行,但是只要执行按键初始化操作就可以复位HalKeyConfigured标志。
osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT); /*如果采用中断方式则不用定时器来发送事件,所以关闭以前为这个事件开启的系统时钟*/
}
}
else /*这里是非中断方式的执行*/
{
HAL_KEY_SW_GLOBAL_IEN &= ~HAL_KEY_SW_IENBIT; /*不允许P1中断*/
HAL_KEY_SW_IEN &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);
/*不允许各按键的中断*/
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);
/*此函数根据传进来的参数启创建一个指定任务的定时器并启动,当定时器计时到时就会发出指定的事件给指定的任务。此函数仅仅是为指定事件和指定任务创建了一个时钟,并使时钟运行,那时钟超时的处理函数,事件的发送是在哪里呢? */
//一路跟踪定位:osal_timer_activate()——osal_timer_hw_setup()——HalTimerStart()——HalTimerInterruptEnable()【不要误会为是一个开启中断的标志,这个函数的操作过程是如果定时器配置中的中断允许为开启的话,就开启定时器的中断,如果为不允许的话就不开启中断,所以其实这是一个定时器中断配置函数。至此已没有能继续跟踪的函数。那么猜想应该是开启了总中断,在定时器计时到时进入中断服务程序进行相关事件和消息的发送,应为系统时钟使用的是一个8位的定时器。
#define OSAL_TIMER HAL_TIMER_2
#define HAL_TIMER_2 0x02 // 8bit timer
我们关键来看看这个定时器的配置情况】
//在函数void InitBoard()【OnBoard.c】中可以发现对系统定时器的配置:
文章评论(0条评论)
登录后参与讨论