关于网站提供的SMALL RTOS应用中遇到的问题
1:中断函数中的变量不能被任务识别2:中断发送信号给任务,单片机不工作,处于死机状态
3:任务也不能想另外一个任务发送信号
-----此内容被lcqqcl于2005-08-31,16:38:08编辑过 挂在这里,居然没有一个发言的,不知道怎么回事?!
哈哈,熬了几个通宵到晚上两点,问题解决了,碰到同样问提的来找我! 我觉得是 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; 这个不改好像也不行
请大虾试试。
顺便感谢 创 建 人: 徐宝田
佩服!! 只在51用过SMALL RTOS。 任务之间可以发送信号,
中断也可以发信号给任务,只能用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()发送信号就绪的,任务之间发送信号没问题。 我是用中断来发送信号量的,共4个任务其他任务都能正常工作,但任务一老是有问题,发送信号量给任务1时总是4个任务都运行。~
页:
[1]