用osal_start_timerEx弄Led blink
不好意思 我是一枚菜鸟刚刚接触这些 我现在想弄Led blink可是我不太会用osal_start_timerEx()这个function.
现在我是这样做,我是用keyfobdemo.c那边改
void KeyFobApp_Init( uint8 task_id )
{
keyfobapp_TaskID = task_id;
// Register for all key events - This app will handle all key events
RegisterForKeys( keyfobapp_TaskID );
osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );
// Setup a delayed profile startup
// osal_start_timerEx( keyfobapp_TaskID, KFD_START_DEVICE_EVT, STARTDELAY );
}
uint16 KeyFobApp_ProcessEvent( uint8 task_id, uint16 events )
{
if ( events & SYS_EVENT_MSG )
{
uint8 *pMsg;
if ( (pMsg = osal_msg_receive( keyfobapp_TaskID )) != NULL )
{
keyfobapp_ProcessOSALMsg( (osal_event_hdr_t *)pMsg );
// Release the OSAL message
VOID osal_msg_deallocate( pMsg );
}
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
if ( events & LED_ON )
{
Led_Init( LED_RED_PORT, LED_RED_PIN );
Led_On( LED_RED_PORT, LED_RED_PIN );
}
if ( events & LED_OFF )
{
Led_Init( LED_RED_PORT, LED_RED_PIN );
Led_Off( LED_RED_PORT, LED_RED_PIN );
}
然后我在keyfobdemo.h那边的Key Fob Task Events加了这些东西
#define LED_ON 0x0040
#define LED_OFF 0x0080
可是我加了这些东西他还是不会运行 我知道uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint32 timeout_value )是这样, taskID已经是不必改的 然后timeout_value我放了500ms, 只是我好奇这个event_id能自己给一个数字他吗就好像以上的define led那样? 如果我要让LED blink有啥办法??? 谢谢各位 如果不明白的话我会edit
1.hal_led.c带了blink的功能。
2. 你设置一个事件就好了,你的事件ID没有问题,只要是一位位的就行了。不要同时出现两位的比如0x0003 [0011]
3. osal_start_timerEx是一次性的,需要你重新调用
4. 事件要清掉
#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )
if ( events & LED_ON )
{
osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );
HAL_TOGGLE_LED1();
return (events ^ LED_ON);
}
4.请问为什么要清掉这个事件呢? 有点不明白 =)求解答 弟万分感激
事件的标志位表示当前需执行的事件。
你执行完了事件,当然要清除标志位。
你在中断里不是也要清除中断标志位?
也请问下为什么我这样放会无效 ?
if ( events & LED_ON )
{
Led_Init( LED_RED_PORT, LED_RED_PIN );
Led_On( LED_RED_PORT, LED_RED_PIN );
}
然后把 osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY )放在void KeyFobApp_Init( uint8 task_id )运行?
if ( events & LED_ON )
{
osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );
HAL_TOGGLE_LED1();
return (events ^ LED_ON);
}
我是一定要start那个timer在这个event才能运行?
你下面这个没有问题啊,有什么问题吗?
if ( events & LED_ON )
{
osal_start_timerEx( keyfobapp_TaskID, LED_ON , STARTDELAY );
HAL_TOGGLE_LED1();
return (events ^ LED_ON);
}
我是指我的 哈哈 你帮我的这个code能运行啊 能解释一下你的code吗? 不太明白 很抱歉 麻烦你了
我上面其实已经说清楚了:
1. osal_timeEx 是一次性的,超时完成了,你需要重新调,以实现周期性事件。
2. 事件发生了,你处理完这个事件后,需要把事件清除。不清除,会一直在这段代码里运行。 ^ 就是清除事件标识。
你的代码为什么不行?如下:
1. 定时器一次性,所以你会出现一次LED_ON事件。你还没有清除这个事件,所有会一直在LED_ON这里转
2. 没有触发LED_OFF事件。实在要做,就在LED_ON事件里调用osal_timerEx来触发LED_OFF事件。为了循环,你还得在LED_OFF事件处理里用 osal_timerEx再触发LED_ON事件。
所以我不用放infinite loop也能重复眨吗?
是的。你的思路也没问题,只是实现起来没注意一些问题,而且比我给你的复杂, 我的一个事件就搞定了。
我想我应该明白了 真抱歉要一一解释给我听 万分感激