打印
[uCOS/RTOS]

OSTimeTick函数的疑惑

[复制链接]
4905|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
banruoju|  楼主 | 2014-5-22 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 banruoju 于 2014-5-26 15:12 编辑

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

ucos_KL25_20140526.zip

899.1 KB

相关帖子

沙发
dirtwillfly| | 2014-5-24 08:36 | 只看该作者
10ms是一个很长的时间,要循环很久才能到。

使用特权

评论回复
板凳
llpanda| | 2014-5-24 10:39 | 只看该作者
我认为这是无道理的,而且和操系统无关,先裸奔实验好

使用特权

评论回复
地板
cc786537662| | 2014-5-24 10:41 | 只看该作者
是指的arm吗?、、、、、、、、、、

使用特权

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

使用特权

评论回复
6
banruoju|  楼主 | 2014-5-26 09:13 | 只看该作者
llpanda 发表于 2014-5-24 10:39
我认为这是无道理的,而且和操系统无关,先裸奔实验好

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

使用特权

评论回复
7
banruoju|  楼主 | 2014-5-26 09:14 | 只看该作者
cc786537662 发表于 2014-5-24 10:41
是指的arm吗?、、、、、、、、、、

是ARM,M0+

使用特权

评论回复
8
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了。
求各位大婶帮帮忙啊!

使用特权

评论回复
9
banruoju|  楼主 | 2014-5-26 13:22 | 只看该作者
dwh000 发表于 2014-5-26 12:33
看看任务状态切换图吧.OSTimeTick()无法将任务从READY状态切换到RUNNING状态.

你好,OSTimeTick是不可以进行任务切换,然而时钟中断服务子程序不是应该可以的吗。
void  OSTickHandler (void)          //时钟中断服务子程序
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR cpu_sr;
#endif

    OS_ENTER_CRITICAL();                        
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    OSTimeTick();                     
    OSIntExit();               //这里进行任务切换                                 
}
然而这个10ms一次的中断却并未进行不是吗,否则低优先级任务2没有挂起操作,应该也可以切换才对呀

使用特权

评论回复
10
llpanda| | 2014-5-26 14:33 | 只看该作者
banruoju 发表于 2014-5-26 09:13
裸奔完全ok,可以进去。
main()
{

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

使用特权

评论回复
11
banruoju|  楼主 | 2014-5-26 15:09 | 只看该作者
本帖最后由 banruoju 于 2014-5-26 15:13 编辑
dwh000 发表于 2014-5-26 13:26
我刚才也去看了下,这里确实能进行任务切换.

首先我想说已经解决了- -!。
方法就是,为了上传整个工程让你帮我看一下,我就把跟KL25相关的文件以及ucos内核从周立功的ucos整个范例包里抠了出来(范例包里有NXP、Frescale等等的相关文件,通过脚本自动选择编译进Keil里),抠出来后我编译后Debug了一下,居然发现解决了,无语.....
虽然还是没找到问题出在哪里,但好歹证明我之前的思路应该是没错的,也就是低优先级任务不需要主动挂起,在高优先级任务delay时间到后,也会自动切换到高优先级任务。这是通过ucos脉搏——时钟中断服务子程序切换的
附件就是我抠出来后的工程,大家可以看一下哈

使用特权

评论回复
12
e08610318| | 2014-5-27 08:47 | 只看该作者
banruoju 发表于 2014-5-26 11:20
其实我实际遇到的问题是这样的:
static void Task1(void *pvArg)
{

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

使用特权

评论回复
13
cuijinyi| | 2014-6-4 10:28 | 只看该作者
应该任务一先执行,然后交出使用权,进行任务切换,执行任务二,任务一进入等待队列,任务一等待时间超时时,把任务一移出等待队列,进行任务切换!应该是等待时间太长了!

使用特权

评论回复
14
w6850916| | 2014-6-5 17:07 | 只看该作者
楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任务挂起,task1就可以了正常了

使用特权

评论回复
15
从此消失| | 2014-11-28 19:07 | 只看该作者
w6850916 发表于 2014-6-5 17:07
楼主的第二个任务里没有交出cpu的使用权,一直占用CPU,task1当然不能运行了,在task2里加入延时什么的让任 ...

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

使用特权

评论回复
16
hgjinwei| | 2014-11-28 21:58 | 只看该作者
我软件仿真跑,task1都可以循环跑下去,楼主确认硬件没问题?比如硬件是否会访问无效地址等。

使用特权

评论回复
17
whereareyou| | 2016-12-20 17:11 | 只看该作者
楼主最后怎么解决的问题?
跪求答案。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝