Embedded uC/OS(嵌入式系统)中的上下文切换
我想知道在RTOS中,是否有可能通过中断强制调度程序将上下文切换到特定任务。我在和microCOS合作 这是执行keyscan并将字符发布到邮箱中的任务,我需要在代码中添加更多功能,如去盎司和自动重复,但我需要整理触发机制,使其正常工作 我不知道如何使用轮询或中断来实现这一点Embedded uC/OS(嵌入式系统)中的上下文切换,embedded,scheduled-tasks,rtos,context-switch,ucos,Embedded,Scheduled Tasks,Rtos,Context Switch,Ucos,我想知道在RTOS中,是否有可能通过中断强制调度程序将上下文切换到特定任务。我在和microCOS合作 这是执行keyscan并将字符发布到邮箱中的任务,我需要在代码中添加更多功能,如去盎司和自动重复,但我需要整理触发机制,使其正常工作 我不知道如何使用轮询或中断来实现这一点 static void AppTaskKeyscan (void *p_arg) { CPU_INT08U debouncing = 1; CPU_INT16U
static void AppTaskKeyscan (void *p_arg)
{
CPU_INT08U debouncing = 1;
CPU_INT16U key;
key_t button={0,0,0};
(void)p_arg;
while (DEF_TRUE)
{
static CPU_INT08U pattern;
key=P10;
OSTimeDlyHMSM(0, 0, 0, 50);
P10=0x0E;
if ((pattern=P10)==0xee)
{button.data='1', button.live=1;}
else if (pattern==0xde)
{button.data='4', button.live=1;}
else if (pattern==0xbe)
{button.data='7', button.live=1;}
else if (pattern==0x7e)
{button.data='*', button.live=1;}
else
{
P10=0x0d;
if ((pattern=P10)==0xed)
{button.data='2', button.live=1;}
else if (pattern==0xdd)
{button.data='5', button.live=1;}
else if (pattern==0xbd)
{button.data='8', button.live=1;}
else if (pattern==0x7d)
{button.data='0', button.live=1;}
else
{
P10=0x0b;
if ((pattern=P10)==0xeb)
{button.data='3', button.live=1;}
else if (pattern==0xdb)
{button.data='6', button.live=1;}
else if (pattern==0xbb)
{button.data='9', button.live=1;}
else if (pattern==0x7b)
{button.data='#', button.live=1;}
else
{
P10=0x07;
if ((pattern=P10)==0xe7)
{button.data='A', button.live=1;}
else if (pattern==0xd7)
{button.data='B', button.live=1;}
else if (pattern==0xb7)
{button.data='C', button.live=1;}
else if (pattern==0x77)
{button.data='D', button.live=1;}
else
button.live=0;
}
}
}
P10=pattern;
if (button.live==0)
OSTimeDlyHMSM(0, 0, 0, 50);
else
{
if (P10==pattern)
OSTimeDlyHMSM(0, 0, 0, 50);
else
button.live=0;
}
P10=0x00;
if (button.live) //if button live, set unread flag to 1 and start count down
{
button.unread=1;
}
if(button.unread&&button.data!='X')
{
key=button.data;
OSMboxPost(KeyMbox, (void *) &key);
button.live=0;
button.unread=0;
}
OSTimeDlyHMSM(0, 0, 0, 200);
} // End of While
}
调度程序通常会执行此操作。它的工作是根据进程/线程的优先级(给定的线程/进程感知调度程序)知道何时进行上下文切换 编辑: 不这样做的原因
设想一个入侵者产生一个低优先级任务,迫使CPU切换上下文(从更高优先级的任务)来执行一些不合理的负载。典型的方法是使用一个键盘处理任务,该任务有一个循环,它挂在一个信号灯上。键盘中断处理程序将发布信号量,这将导致处理任务准备就绪并执行。必须使用可用的中断兼容(即非阻塞)IPC机制来发送任务信号。为键盘提供服务的最简单方法是ISR将键代码放入队列中。任何需要用户输入的任务都将从此队列中读取 或者,您可以简单地让ISR增加一个计数信号量,并将键盘解码延迟到一个任务,然后该任务可以将字符放入一个队列中,该队列可以由任何任务读取用户输入读取。如果解码在执行时间上较长或可变,则这可能是优选的 特别是在uC/OS-II中,需要运行调度程序的ISR必须使用osinenter()和ositexit()调用。当最后一个嵌套中断完成时,正是ositexit()使调度程序运行。然后将根据调度策略调度任务。为了强制特定任务按照调度策略运行而绕过策略是不可能的,您也不应该这样做!如果特定任务必须运行,则将其设置为最高优先级
通常情况下,ISR序言/尾声功能仅适用于进行操作系统调用的ISR,因为这样做不会导致调度程序需要运行。当我编写keyscan任务时,我希望在按下任何键时有一个中断,那么如何让调度程序识别这一点?@Amanni通常情况下,您有一个键盘中断,然后,您可以通过按键向键盘进程发送消息。调度程序将知道何时运行键盘进程,该进程将接收您按下的键发送的消息,并将显示该消息或您想对其执行的任何操作。抱歉,这是一种痛苦,但什么是键盘进程?@Amanni没关系;我假设你正在制作操作系统。一个操作系统有许多进程;您可以根据需要添加任意数量的内容,但一些必要的内容包括:空进程、键盘、屏幕、计时器。请看我写的这篇文章:。可能会发现这个链接很有用:非常感谢,我不是在写操作系统,我只是在为我的keyscan寻找一个触发器,我可以决定是使用中断还是轮询,或者具体地说,我无法让这两种方法都起作用。我将编辑问题,以便添加我的代码为什么在表单
{button.data='A',button.live=1;}
的行中使用逗号运算符?