创建一个任务
void creat_key_task( void )
{
osThreadDef( key, key_task , osPriorityHigh, 0, configMINIMAL_STACK_SIZE*3);
keyTask = osThreadCreate(osThread(key), NULL);
configASSERT(keyTask);
}
任务干活
static void key_task( void const *pvParameters)
{
keyTaskType key;
configASSERT( ( ( unsigned long ) pvParameters ) == 0 );
keyTimerHandle = timer.creat(15000 , FALSE , key_timer_isr);
touch_key_clear();
memset(&key,0x00,sizeof(keyTaskType));
while(1)
{
if(xQueueReceive( xKeyQueue, &key, 1000 ) == pdTRUE)
{
key_handle(&key);
memset(&key,0x00,sizeof(keyTaskType));
}
task_keep_alive(TASK_KEY_BIT);
}
}
核心代码是处理按键
static void key_handle(keyTaskType *key)
{
switch(key->cmd)
{
case SYS_KEY:
{
system_key_handle(key);
}break;
case TOUCH_KEY:
{
touch_key_handle(key);
}break;
case FUN_KEY:
{
fun_key_handle(key);
}break;
default:log_err("按键命令错误,CMD=%d\n" ,key->cmd);
}
}
//具体
static void system_key_handle(keyTaskType *key)
{
switch(key->keyValue)
{
case KEY_1_SEC:
{
tag_config_enable(TRUE);
beep.write(BEEP_NORMAL);
log(DEBUG,"使能安装工刷卡\n");
}break;
case KEY_8_SEC:
{
tag_config_enable(FALSE);
beep.write_base(&beepRestore);
set_clear_flash(FLASH_ALL_DATA);
}break;
default:log_err("按键键值错误,VALUE=%d\n" ,key->keyValue);
}
}
不同的按键执行不同 的函数。
好了,这个任务就是前台程序,它是处理者。
后台程序是其他模块,比如其他任务或者其他函数,给它的消息队列发送消息。
上面全部在Key_Task.c
下面就是在后台的了。
这个模块叫做Config_Key.c它很简单就是GPIO外面一个按键,按下去会有中断触发,同时用一个定时器扫描区别看按键按下去1S还是8S,发送出2个消息。(以前我就是在it.c发送的)看看别人的。
这是初始化 最下面一句话是很宏观的,把这个函数加入到数组中一起初始化。自己初始化了按键中断,同时开启了定时器扫描。
static void config_key_exit_interrupt( void )
{
if( pin_ops.pin_read(CONFIG_KEY_PIN) == PIN_LOW)
{
timer.start(configKeyHandle);
log(INFO,"中断检测到系统按键输入 ,INPUT =%d\n" ,pin_ops.pin_read(CONFIG_KEY_PIN));
}
}
static void config_key_init( void )
{
pin_ops.pin_mode(CONFIG_KEY_PIN , PIN_MODE_INPUT_PULLUP);
pin_ops.pin_exit(CONFIG_KEY_PIN , config_key_exit_interrupt);
configKeyHandle = timer.creat( 100 , FALSE , config_key_timer_isr);
}
MODULES_INIT_EXPORT(config_key_init , "config key");
这就是发送消息给前台task
static uint32_t pushTime=0;
static void config_key_timer_isr(void)
{
if(pin_ops.pin_read(CONFIG_KEY_PIN) == PIN_LOW)
{
pushTime++;
}
else
{
pushTime = 0;
timer.stop(configKeyHandle);
}
if( pushTime == 2)
{
keyTaskType key;
key.cmd = SYS_KEY;
key.keyValue = KEY_1_SEC;
xQueueSendFromISR( xKeyQueue, ( void* )&key, NULL );
}
else if( pushTime == 40)
{
keyTaskType key;
key.cmd = SYS_KEY;
key.keyValue = KEY_8_SEC;
xQueueSendFromISR( xKeyQueue, ( void* )&key, NULL );
}
}
其实写的并不好 你能看的按8S的时候会发送2个消息的 先发1S在发8S的。 在处理函数里面8S的先把1S干的活推翻看