因为案子的关系,研究了RTX,了解任务并行处理,还是有个RTOS作TASK并行处理会比较好。
写了一个例子,在KEIL RTX下把ADC取样,GPIO开关,UART打印,USB MOUSE送资料,结合起来。
NUC230_240BSP_CMSIS_V3.00.001 RTX ADC GPIO USB.zip
(455.9 KB)
__task void task2 (void)
{
while(1)
{
os_dly_wait(10);
adc_value=Get_ADC_Knob();
os_sem_send(Sem_arrive1);
}
}
有使用到Semaphore在ADC处理完後,通知UART处理的TASK去读ADC值,
__task void task4 (void)
{
while(1)
{
printf("0x%x\n\r", adc_value);
os_sem_wait(Sem_arrive1, 0xFFFF); // The semaphores ensure both tasks arrive here before continuing
}
}
GPIO的TASK去读ADC值改变开关速度。
__task void task3 (void)
{
while(1)
{
Write_LED_Color_Flash(adc_value);
}
}
USB的TASK,检查是否要送按键REPORT,其它的部份交给中断处理。
__task void task1 (void)
{
tsk1 = os_tsk_self();
os_tsk_prio(tsk1, 1);
tsk2 = os_tsk_create(task2, 1);
tsk3 = os_tsk_create(task3, 1);
tsk4 = os_tsk_create(task4, 1);
os_sem_init(Sem_arrive1, 0); // Create two semaphores each with no tokens
os_sem_init(Sem_arrive2, 0);
while(1)
{
uint8_t *buf;
if(g_u8EP2Ready)
{
buf = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP2));
/* Update new report data */
buf[0] = 0x00;
buf[1]=0x00;
buf[2]=0x00;
buf[3]=0x00;
if(Get_Key_Input()==0x01)
buf[1] = 16;
if(Get_Key_Input()==0x02)
buf[1] = -16;
if(Get_Key_Input()==0x04)
buf[2] = 16;
if(Get_Key_Input()==0x08)
buf[2] = -16;
g_u8EP2Ready = 0;
/* Set transfer length and trigger IN transfer */
USBD_SET_PAYLOAD_LEN(EP2, 4);
}
}
}
|