OSTimeTick函数的疑惑
本帖最后由 banruoju 于 2014-5-26 15:12 编辑OSTimeTick这个时钟节拍函数被时钟中断服务子程序调用(假设10ms周期),那么OSTimeTick理论上就是10ms都会调用一次是吗?
可为什么像我下面这样写时,调试时,就一直在for循环里,再也进不去OSTimeTick函数里了(OSTimeTick函数里设置断点)?
请问问题出在哪里啊
static void Task1(void *pvArg)
{
pvArg = pvArg;
for(;;)
{
}
}
(只有这一个任务) 10ms是一个很长的时间,要循环很久才能到。 我认为这是无道理的,而且和操系统无关,先裸奔实验好 是指的arm吗?、、、、、、、、、、 操作系统下的gettimetick类函数,根据OS不同。实现也不一。time tick通常是指自系统启动之后CPU的滴答个数。通常1000次滴答是一秒。一个函数只是返回调用那一刻时系统的滴答数目。所以这个函数没有中断死循环的功能。不调用就没法返回了。 llpanda 发表于 2014-5-24 10:39 static/image/common/back.gif
我认为这是无道理的,而且和操系统无关,先裸奔实验好
裸奔完全ok,可以进去。
main()
{
systick_init();//系统滴答开中断
for(;;)
{}
}
所以我觉得可能是我的ucos的问题,但是我的ucos是周立功的范例啊,没有自己改过,应该没什么问题才对。 cc786537662 发表于 2014-5-24 10:41 static/image/common/back.gif
是指的arm吗?、、、、、、、、、、
是ARM,M0+ 其实我实际遇到的问题是这样的:
static void Task1(void *pvArg)
{
pvArg = pvArg;
for(;;)
{
UART_printf("task1\n");
OSTimeDly(OS_TICKS_PER_SEC);
}
}
static void Task2(void *pvArg)
{
pvArg = pvArg;
for(;;)
{
}
}
task1优先级高于task2,但是task1任务进行delay后却再也回不到运行态了,也就是说串口输出端:只有一行task1。跟我预想中的1s一行不符,debug时发现之后就一直在task2中运行,根本没有运行过OSTimeTick,因而也就无法唤醒task1了。
求各位大婶帮帮忙啊! dwh000 发表于 2014-5-26 12:33 static/image/common/back.gif
看看任务状态切换图吧.OSTimeTick()无法将任务从READY状态切换到RUNNING状态.
你好,OSTimeTick是不可以进行任务切换,然而时钟中断服务子程序不是应该可以的吗。
voidOSTickHandler (void) //时钟中断服务子程序
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit(); //这里进行任务切换
}
然而这个10ms一次的中断却并未进行不是吗,否则低优先级任务2没有挂起操作,应该也可以切换才对呀 banruoju 发表于 2014-5-26 09:13 static/image/common/back.gif
裸奔完全ok,可以进去。
main()
{
极其有可能的是,在启动代码里把SYSTICK中断的入口函数名改了,请检查启动文件 本帖最后由 banruoju 于 2014-5-26 15:13 编辑
dwh000 发表于 2014-5-26 13:26 static/image/common/back.gif
我刚才也去看了下,这里确实能进行任务切换.
首先我想说已经解决了- -!。
方法就是,为了上传整个工程让你帮我看一下,我就把跟KL25相关的文件以及ucos内核从周立功的ucos整个范例包里抠了出来(范例包里有NXP、Frescale等等的相关文件,通过脚本自动选择编译进Keil里),抠出来后我编译后Debug了一下,居然发现解决了,无语.....
虽然还是没找到问题出在哪里,但好歹证明我之前的思路应该是没错的,也就是低优先级任务不需要主动挂起,在高优先级任务delay时间到后,也会自动切换到高优先级任务。这是通过ucos脉搏——时钟中断服务子程序切换的
附件就是我抠出来后的工程,大家可以看一下哈 banruoju 发表于 2014-5-26 11:20 static/image/common/back.gif
其实我实际遇到的问题是这样的:
static void Task1(void *pvArg)
{
uCos的任务切换一般有两种,一种是在任务里面,执行到某些系统函数如OSTimeDly()函数或其他函数(比如消息传递的函数)处进行任务调度,另外一种是在timeTick里面进行任务调度。这就是uCos的实时性特点主要体现在中断中调度里面。你这个函数,Task1肯定能进去的,只能通过抢占调度的方式。
你之所以进不去跟你前面的原因有关,因为timeTick执行不到。
应该任务一先执行,然后交出使用权,进行任务切换,执行任务二,任务一进入等待队列,任务一等待时间超时时,把任务一移出等待队列,进行任务切换!应该是等待时间太长了! 楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任务挂起,task1就可以了正常了 w6850916 发表于 2014-6-5 17:07 static/image/common/back.gif
楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任 ...
不是有两种任务切换方式吗?你说的是第一种,所谓抢占式就是楼主的方法了,不一定非要主动加延时 我软件仿真跑,task1都可以循环跑下去,楼主确认硬件没问题?比如硬件是否会访问无效地址等。
楼主最后怎么解决的问题?
跪求答案。
页:
[1]