banruoju 发表于 2014-5-22 10:26

OSTimeTick函数的疑惑

本帖最后由 banruoju 于 2014-5-26 15:12 编辑

OSTimeTick这个时钟节拍函数被时钟中断服务子程序调用(假设10ms周期),那么OSTimeTick理论上就是10ms都会调用一次是吗?
可为什么像我下面这样写时,调试时,就一直在for循环里,再也进不去OSTimeTick函数里了(OSTimeTick函数里设置断点)?
请问问题出在哪里啊
static void Task1(void *pvArg)
{
pvArg = pvArg;
for(;;)
{
}
}
(只有这一个任务)

dirtwillfly 发表于 2014-5-24 08:36

10ms是一个很长的时间,要循环很久才能到。

llpanda 发表于 2014-5-24 10:39

我认为这是无道理的,而且和操系统无关,先裸奔实验好

cc786537662 发表于 2014-5-24 10:41

是指的arm吗?、、、、、、、、、、

wowotoulovekk 发表于 2014-5-24 18:22

操作系统下的gettimetick类函数,根据OS不同。实现也不一。time tick通常是指自系统启动之后CPU的滴答个数。通常1000次滴答是一秒。一个函数只是返回调用那一刻时系统的滴答数目。所以这个函数没有中断死循环的功能。不调用就没法返回了。

banruoju 发表于 2014-5-26 09:13

llpanda 发表于 2014-5-24 10:39 static/image/common/back.gif
我认为这是无道理的,而且和操系统无关,先裸奔实验好

裸奔完全ok,可以进去。
main()
{
systick_init();//系统滴答开中断
for(;;)
{}
}
所以我觉得可能是我的ucos的问题,但是我的ucos是周立功的范例啊,没有自己改过,应该没什么问题才对。

banruoju 发表于 2014-5-26 09:14

cc786537662 发表于 2014-5-24 10:41 static/image/common/back.gif
是指的arm吗?、、、、、、、、、、

是ARM,M0+

banruoju 发表于 2014-5-26 11:20

其实我实际遇到的问题是这样的:
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了。
求各位大婶帮帮忙啊!

banruoju 发表于 2014-5-26 13:22

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没有挂起操作,应该也可以切换才对呀

llpanda 发表于 2014-5-26 14:33

banruoju 发表于 2014-5-26 09:13 static/image/common/back.gif
裸奔完全ok,可以进去。
main()
{


极其有可能的是,在启动代码里把SYSTICK中断的入口函数名改了,请检查启动文件

banruoju 发表于 2014-5-26 15:09

本帖最后由 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脉搏——时钟中断服务子程序切换的
附件就是我抠出来后的工程,大家可以看一下哈

e08610318 发表于 2014-5-27 08:47

banruoju 发表于 2014-5-26 11:20 static/image/common/back.gif
其实我实际遇到的问题是这样的:
static void Task1(void *pvArg)
{


uCos的任务切换一般有两种,一种是在任务里面,执行到某些系统函数如OSTimeDly()函数或其他函数(比如消息传递的函数)处进行任务调度,另外一种是在timeTick里面进行任务调度。这就是uCos的实时性特点主要体现在中断中调度里面。你这个函数,Task1肯定能进去的,只能通过抢占调度的方式。
你之所以进不去跟你前面的原因有关,因为timeTick执行不到。

cuijinyi 发表于 2014-6-4 10:28

应该任务一先执行,然后交出使用权,进行任务切换,执行任务二,任务一进入等待队列,任务一等待时间超时时,把任务一移出等待队列,进行任务切换!应该是等待时间太长了!

w6850916 发表于 2014-6-5 17:07

楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任务挂起,task1就可以了正常了

从此消失 发表于 2014-11-28 19:07

w6850916 发表于 2014-6-5 17:07 static/image/common/back.gif
楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任 ...

不是有两种任务切换方式吗?你说的是第一种,所谓抢占式就是楼主的方法了,不一定非要主动加延时

hgjinwei 发表于 2014-11-28 21:58

我软件仿真跑,task1都可以循环跑下去,楼主确认硬件没问题?比如硬件是否会访问无效地址等。

whereareyou 发表于 2016-12-20 17:11

楼主最后怎么解决的问题?
跪求答案。
页: [1]
查看完整版本: OSTimeTick函数的疑惑