lcqqcl 发表于 2005-8-31 11:56:39

关于网站提供的SMALL RTOS应用中遇到的问题

1:中断函数中的变量不能被任务识别

2:中断发送信号给任务,单片机不工作,处于死机状态

3:任务也不能想另外一个任务发送信号
-----此内容被lcqqcl于2005-08-31,16:38:08编辑过

lcqqcl 发表于 2005-9-3 22:38:05

挂在这里,居然没有一个发言的,不知道怎么回事?!



哈哈,熬了几个通宵到晚上两点,问题解决了,碰到同样问提的来找我!

armok 发表于 2005-9-3 23:58:03

huanghb 发表于 2006-8-13 18:29:31

我觉得是 Os_Enter_Sum 在作怪,在os_cpu_a.c 的最后:

        if(Os_Enter_Sum==0)

        {

                sei();

        }

GCC 用了        :POPALL();   /*全部寄存器堆出栈   */



出栈后的 R24作为Os_Enter_Sum // 错误

现在 在os_core.c 的设Os_Enter_Sum 变量的地方用了volatile 可以了:

volatile uint8 Os_Enter_Sum = 0;        // 原来只是简单的重复使用R24 , 错误

还有os.h 的extern volatile uint8 Os_Enter_Sum; 这个不改好像也不行



请大虾试试。

顺便感谢 创   建   人: 徐宝田

佩服!!

TMS320VC5402 发表于 2006-12-29 19:51:50

只在51用过SMALL RTOS。

TMS320VC5402 发表于 2006-12-30 11:30:31

任务之间可以发送信号,

中断也可以发信号给任务,只能用OSIntSendSignal(),

如果是非系统管理中断,必须注意如下设置,



1.非系统管理中断优先级要设置成最高;

2.将Os_cpu.h中EN_SP2定义为1

3.将Os_cpu.h中Sp2Space定义为适当大小,为非系统管理中断堆栈提供空间;

4.重写三个宏OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()和SET_EA,

   比如51单片机系统时钟中断用T2,另外使用非系统管理中断T0,设置时这样的:

#defineOS_ENTER_CRITICAL()IE&=~0x20,Os_Enter_Sum++   //关闭系统时钟中断和系统管理中断,不要关闭非系统管理中断;

#defineOS_EXIT_CRITICAL()   if (--Os_Enter_Sum==0)IE|=0xa0//打开系统时钟中断和系统管理中断,这里千万不能把不受系统管理的中断打开(否则,系统就会崩溃);

SET_EA   MACRO

ORL   IE,#0A0H    ;打开系统时钟中断和系统管理中断,这里千万不能把不受系;

ENDM                  ;管理的中断打开(否则,系统就会崩溃)

5.非系统管理中断不允许调用OS_INT_ENTER()和OSIntExit();但可以调用OSIntSendSignal()发送信号,使某个任务就绪。

6.在合适的时候打开非系统管理中断。

我是用一个单独的任务控制非系统管理中断,这个任务是由其他任务OSIntSendSignal()发送信号就绪的,任务之间发送信号没问题。

yanhanyu 发表于 2007-4-7 20:28:26

我是用中断来发送信号量的,共4个任务其他任务都能正常工作,但任务一老是有问题,发送信号量给任务1时总是4个任务都运行。~
页: [1]
查看完整版本: 关于网站提供的SMALL RTOS应用中遇到的问题