搜索
bottom↓
回复: 83

一个ucos2在mega16上的移植例子,使用WinAVR编译 (转贴)

[复制链接]

出0入0汤圆

发表于 2007-7-5 20:47:28 | 显示全部楼层 |阅读模式
(原作者: hotislandn)


点击此处下载ucos2在mega16上的移植例子.rar



有兴趣的请讨论一下

uC/OS-II 在 AVR 上的移植

hotislandn@hotmail.com www.mcuzone.com

IDE: PN Compiler: AVR-GCC ( WinAVR 20050214 ) Target: ATmega16 @ 7.3728MHz

2005-07-28 V1.0 1. 由于ATmega16的RAM资源很少,所以在OS_CFG.H中关闭所有不必要的功能,同时优化代码,减少RAM占用 在os_core.c中,有两个数组: INT8U const OSMapTbl[8]与 INT8U const OSUnMapTbl[256],虽然声明为const类型,但是avr-gcc并不会将其放置在flash中,必须加以修改为INT8U const OSMapTbl[8] PROGMEM 与INT8U const OSUnMapTbl[256] PROGMEM ,同样的,该文件中访问这些数组的语句也必须做相应的修改。这样的结果是速度会受到影响,但是由于仍然是查表操作,任务切换的时间还是确定的。 2. 任务说明 系统中一共有5个用户任务:Task1-Task5,其优先级依次为1,2,3,5,4。每个用户任务的堆栈均为OS_USER_TASK_STK_SIZE(定义于os_cfg.h,目前为64字节)。 系统中建立有一个信号量T2sem与一个邮箱Tmbox。 Task1完成了Timer0的初始化,并打开了定时器中断,使得任务调度可以正常进行。此后,该任务只隔一个很短的时间使得变量t1增加,同时取反PORTB.1。 Task2初始化了Timer2,并使能了Timer2中断,然后任务挂起,等待信号量T2sem,如果等到且无错误,则使得变量t2增加。 Task3使得PD2上出现一个脉冲,以触发INT0,并使得变量t3增加。 Task4使得PD3上出现一个脉冲,以触发INT1,并使得变量t4增加。 Task5使得该任务挂起等待邮箱中有一条消息,如果取得消息,就将t5的值更新。 3. 中断系统 需要引用系统服务的中断,其底层部分被定义于AVRect.S中,中断的处理函数被定义于AVRisr.c中,例如例子中外部中断0与外部中断1的服务函数。 对于无需引用系统服务的中断函数,比如例子中的Timer2比较匹配中断,可以全部定义于AVRisr.c中。 Timer2的中断只是使得变量t6增加。 INT0的中断向任务发出信号量。 INT1的中断发送一个消息到信箱。 由于AVR的RAM有限,移植并未考虑中断重入的问题。 2005-07-16 V0.9 1. OS版本为2.76 2. 使用Timer0的比较匹配中断为系统定时,频率为100Hz 3. 三种临界代码保护方式均可以使用,在OS_CPU.h里直接设置即可

如果安装了WinAVR20050214,则直接运行start.bat,输入make all即可开始编译。 如果需要在AVRStudio仿真,运行make extcoff后即可生成调试所需的cof文件。


#include <avr/io.h>



#include "ucos_ii.h"



OS_STK Task1Stk[OS_USER_TASK_STK_SIZE]={0};

OS_STK Task2Stk[OS_USER_TASK_STK_SIZE]={0};

OS_STK Task3Stk[OS_USER_TASK_STK_SIZE]={0};

OS_STK Task4Stk[OS_USER_TASK_STK_SIZE]={0};

OS_STK Task5Stk[OS_USER_TASK_STK_SIZE]={0};



volatile unsigned char t1=0;

volatile unsigned char t2=0;

volatile unsigned char t3=0;

volatile unsigned char t4=0;

volatile unsigned char t5=0;

volatile unsigned char t6=0;



OS_EVENT *T2sem=(OS_EVENT *)0;

OS_EVENT *Tmbox=(OS_EVENT *)0;



struct msgTask

{

unsigned char cnt;

unsigned char *s;

};



struct msgTask T5mbox={1,"Hello"};

struct msgTask *pMsgTsk=&T5mbox;



void Task1(void *pdata)

{

pdata=pdata;



TIMSK&=0xFC;



#if OS_TICKS_PER_SEC <= (F_CPU/1024/256)

#error "OS_TICKS_PER_SEC <  (F_CPU/1024/256) "

#endif



OCR0=F_CPU/1024/OS_TICKS_PER_SEC;

TCNT0=0;





TCCR0=(1<<WGM01)|0x05;



TIMSK|=2;



DDRB|=0x02;



while(1)

    {



         OSTimeDly(2);

         t1++;

         PORTB^=0x02;

        }

}



void Task2(void *pdata)

{

unsigned char err=0;

pdata=pdata;



MCUCR=0x02;

GICR=0x40;



TCCR2=0x08;      // CTC 模式, TOP=OCR2

OCR2=72;         // 7372800/1024/72=100

TCCR2|=0x07;     // 1024分频

TIMSK|=0x80;     // 比较中断使能



while(1)

    {        

              OSSemPend(T2sem,0,&err);

              if(err==OS_NO_ERR)

                        t2++;

              if(err==OS_TIMEOUT)

                        {};

              GIFR|=0x40;

        // OSTimeDly(10);         

        }

}



void Task3(void *pdata)

{





pdata=pdata;



while(1)

    {

         t3++;

         OSTimeDly(4);

               DDRD|=0x04;

               PORTD|=0x04;

               PORTD&=~0x04;         

        }

}



void Task4(void *pdata)

{

pdata=pdata;



MCUCR|=0x08;

GICR|=0x80;



while(1)

    {

         t4++;

         OSTimeDly(8);

               DDRD|=0x08;

               PORTD|=0x08;

               PORTD&=~0x08;         

        }

}



void Task5(void *pdata)

{

unsigned char err=0;

struct msgTask *p=( struct msgTask *)0;



pdata=pdata;



while(1)

    {

               p=( struct msgTask *)OSMboxPend(Tmbox,0,&err);

               

         t5=p->cnt;         

        }

}



int main(void)

{

OSInit();



OSTaskCreate(Task1,0,&Task1Stk[OS_USER_TASK_STK_SIZE-1],1);

OSTaskCreate(Task2,0,&Task2Stk[OS_USER_TASK_STK_SIZE-1],2);

OSTaskCreate(Task3,0,&Task3Stk[OS_USER_TASK_STK_SIZE-1],3);

OSTaskCreate(Task4,0,&Task4Stk[OS_USER_TASK_STK_SIZE-1],5);

OSTaskCreate(Task5,0,&Task5Stk[OS_USER_TASK_STK_SIZE-1],4);



T2sem=OSSemCreate(0);

Tmbox=OSMboxCreate((void *)0);



OSStart();

}

http://www.mcuzone.com/bbs/dispbbs.asp?boardid=15&id=186

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-9-30 08:02:02 | 显示全部楼层
楼主:我接了发光二极管 可是为什么不闪呢 难道任务一没有执行到??

出0入0汤圆

发表于 2008-1-25 11:46:59 | 显示全部楼层
楼主,用这个例子已经可以跑起来了。
加入了lcd跟串口功能,但出现了问题:
任务5用了邮箱,但一旦想把p->s显示出来,或是操作p->cnt的时候,任务2中的err就开始报错了,返回的值是OS_ERR_EVENT_TYPE,也就是说有可能在等待sem量时,读到的那个t2sem不再是sem量类型。。。不知道问题出在哪里?
各位大侠不知道有没有遇到这种情况?请指点指点

出0入0汤圆

发表于 2008-1-28 20:48:49 | 显示全部楼层
找到原因了,的确是堆栈的问题。。。感谢楼主提供源程序!

出0入0汤圆

发表于 2008-3-19 11:22:27 | 显示全部楼层
mark

出0入42汤圆

发表于 2008-3-19 18:23:46 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-3-20 16:43:43 | 显示全部楼层
.

出0入0汤圆

发表于 2008-3-20 16:56:27 | 显示全部楼层
pdata=pdata;
这句的作用是什么?

出0入0汤圆

发表于 2008-3-20 17:03:43 | 显示全部楼层
避免编译警告

出0入0汤圆

发表于 2008-3-20 17:06:44 | 显示全部楼层
如果没有 会出现什么警告?

出0入0汤圆

发表于 2008-4-13 09:44:26 | 显示全部楼层
下载后,直接运行start.bat,输入make all结束后烧写,发现PORTB.1不闪。
用调试发现跑不到TASK1()中的
         t1++;
         PORTB^=0x02;
请教一下还需要哪些设置。

出0入0汤圆

发表于 2008-4-13 11:16:03 | 显示全部楼层
好东西,谢谢!

出0入46汤圆

发表于 2008-5-29 21:02:14 | 显示全部楼层
好!

出0入0汤圆

发表于 2008-5-29 22:10:58 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-6-2 22:21:33 | 显示全部楼层
为什么用studio(GCC)编译不了啊?

出0入0汤圆

发表于 2008-6-2 23:39:42 | 显示全部楼层
好 东 西 !

出0入0汤圆

发表于 2008-6-3 08:40:53 | 显示全部楼层
正需要这个,谢谢

出0入0汤圆

发表于 2008-6-3 11:52:08 | 显示全部楼层
一年前买了一片M16L,还没动。
下来学习一下。谢谢LZ

出0入0汤圆

发表于 2008-6-12 09:01:21 | 显示全部楼层
楼主:我接了发光二极管 可是为什么不闪呢 难道任务一没有执行到??

出0入0汤圆

发表于 2008-7-20 18:16:40 | 显示全部楼层
学习,准备移植A128

出0入0汤圆

发表于 2008-9-12 01:30:47 | 显示全部楼层
楼主的源程序内容是可行的,但是实际根本就跑不动的,实验证明,最多只能运行除默认任务外的三个任务,一个LED显烁任务兼初始任务设置时钟,一个中断发生任务并在中断程序中发送“ucos2”邮箱信息,另一个等待邮箱信息,成功后,通过串口显示出来。
附件是本人改进代码和proteus仿真图,希望对跟我一样的初学者有用。
ucosii mega16移植ourdev_414449.rar(文件大小:275K) (原文件名:m16移植.rar)

出0入0汤圆

发表于 2008-10-28 10:17:18 | 显示全部楼层
LS&nbsp;&nbsp;你的定时中断向量设错了,LZ的例子运行没有问题的

出0入0汤圆

发表于 2009-1-13 13:51:27 | 显示全部楼层
路过,学习一下

出0入0汤圆

发表于 2009-1-13 20:39:42 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-1-14 17:16:31 | 显示全部楼层
先学习了

出0入0汤圆

发表于 2009-1-29 00:04:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-22 15:50:05 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-4-22 19:43:50 | 显示全部楼层
为何在studio中编译会出现  ERROR:object  file not found on excpect location C:\ucos\default.elf

出0入0汤圆

发表于 2009-4-22 19:58:17 | 显示全部楼层
请教 如何才能在astudio  中使用ucos??

出0入0汤圆

发表于 2009-4-30 06:02:54 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-5-5 15:51:56 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-7-14 15:33:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-16 17:07:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-29 14:10:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-29 20:50:58 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-9-29 20:51:32 | 显示全部楼层
看看了,学习一下。

出0入0汤圆

发表于 2009-10-24 15:10:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-25 21:21:29 | 显示全部楼层
楼主和21楼的代码 在avr studio(gcc)中打开会有如下问题……

Object file does not exist: C:\Users\user\Desktop\m16移植\uCOS2AVR.cof

出0入0汤圆

发表于 2009-12-19 21:55:57 | 显示全部楼层
请问一下,大家编译后,hex文件大小为多少,我的有17.4KB,而atmega16flash 只有16KB,困惑中...

出0入0汤圆

发表于 2009-12-19 23:50:07 | 显示全部楼层
先顶LZ。

    在Mega16中跑uCOS玩玩可以,但是实际使用可能不太合适。最高优先级就绪任务的查表,典型的空间换时间算法,INT8U const OSMapTbl[8]与 INT8U const OSUnMapTbl[256],如果为了速度,存RAM中,要占用约262bytes,幸好可以存Flash,LZ的这点改动很适用。

    AVR寄存器太多,提高了运算速度,但是给跑OS带来了不少麻烦,因为每个任务堆栈至少要保存: 断点地址(2bytes)+ R0-R31(32bytes)+SREG(1Byte) = 35bytes,加上函数调用入栈、局部变量使用、中断保护入栈保护等,个人觉得64bytes是有点不够用的,就算64bytes够用了,5个任务,64×5=320字节了,另外加上每个TCB任务控制块, ECB事件控制块,系统控制调度等的RAM需求,算80bytes吧(没细算,因该不会比这个少),1KRAM就用掉400bytes了,太占资源了。

出0入0汤圆

发表于 2009-12-19 23:52:19 | 显示全部楼层
回复完发现是古董了,39楼挖坟哈,开-0S优化试试。

出0入0汤圆

发表于 2009-12-21 00:46:16 | 显示全部楼层
make.exe: *** No rule to make target `all'.  Stop.
怎么我编译总是出现这个啊。是不是要设置MAKEFILE文件啊,怎么设置呢

出0入0汤圆

发表于 2009-12-23 23:17:57 | 显示全部楼层
39楼,烧写的是二进制文件吧,hex应该不是最终文件,hex文件包括数据格式信息要比烧写文件大很多。有很多书附录有hex文件说明

出0入0汤圆

发表于 2009-12-25 16:40:30 | 显示全部楼层
回复【2楼】zsulrq 正宗番茄
楼主,用这个例子已经可以跑起来了。
加入了lcd跟串口功能,但出现了问题:
任务5用了邮箱,但一旦想把p-&gt;s显示出来,或是操作p-&gt;cnt的时候,任务2中的err就开始报错了,返回的值是OS_ERR_EVENT_TYPE,也就是说有可能在等待sem量时,读到的那个t2sem不再是sem量类型。。。不知道问题出在哪里?
各位大侠不知道有没有遇到这种情况?请指点指点
-----------------------------------------------------------------------

我也遇到了相同的问题,难道其他人都没遇到吗?我也发现了是堆栈的问题,就是多任务刚运行时就把存放信号量指针值的寄存器给覆盖了,不知道2楼最后是如何解决的,能否详细告知?其他同行若看到能否帮忙解答下,或给个解决的建议也行呀?

出0入0汤圆

发表于 2009-12-25 18:12:06 | 显示全部楼层
楼上的,都知道问题在哪里了,直接把堆栈开大点不就得了。如果实在RAM空间不够了,那就想办法继续压缩内核,或减少任务数吧。

出0入0汤圆

发表于 2010-4-5 14:12:23 | 显示全部楼层
OK

出0入0汤圆

发表于 2010-4-15 00:17:40 | 显示全部楼层
OK

出0入0汤圆

发表于 2010-4-15 09:18:45 | 显示全部楼层
关注,学习

出0入0汤圆

发表于 2010-5-5 16:49:48 | 显示全部楼层
关注!

出0入0汤圆

发表于 2010-5-10 16:11:09 | 显示全部楼层
为何优化级别选择0运行就不正常了呢

出0入0汤圆

发表于 2010-5-15 01:12:09 | 显示全部楼层
我初学ucos,但是我怎么感觉LZ分享的代码有点问题呢,我把代码直接拿来(其中就把点灯的PB口改为了PA口)烧尽片中,发现根本没有反应,好像很多任务都没进去,刚好是当成一个学习过程,我就在原代码上做些自己认为对的改正,经过探索和调试,最后调出来了,所有任务经过标记,都表明正常进去了。把main 函数贴出来大家看看,有低级错误的话请大家指正。

#include <avr/io.h>

#include "ucos_ii.h"

OS_STK Task1Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task2Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task3Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task4Stk[OS_USER_TASK_STK_SIZE]={0};
OS_STK Task5Stk[OS_USER_TASK_STK_SIZE]={0};

volatile unsigned char t1=0;
volatile unsigned char t2=0;
volatile unsigned char t3=0;
volatile unsigned char t4=0;
volatile unsigned char t5=0;
volatile unsigned char t6=0;

OS_EVENT *T2sem=(OS_EVENT *)0;
OS_EVENT *Tmbox=(OS_EVENT *)0;

struct msgTask
{
unsigned char cnt;
unsigned char *s;
};

struct msgTask T5mbox={1,"Hello"};
struct msgTask *pMsgTsk=&T5mbox;

void Task1(void *pdata)
{
pdata=pdata;

TIMSK&=0xFC;

#if OS_TICKS_PER_SEC <= (F_CPU/1024/256)
#error "OS_TICKS_PER_SEC <  (F_CPU/1024/256) "
#endif

OCR0=F_CPU/1024/OS_TICKS_PER_SEC;
TCNT0=0;


TCCR0=(1<<WGM01)|0x05;

TIMSK|=2;

DDRA|=(1<<0);
PORTA|=(1<<0);//测试防干扰
while(1)
    {
     t1++;
         PORTA^=(1<<0);
         OSTimeDly(20);//注意前后,是不是一调用OSTimeDly就开始挂起的??
                        //查了书之后知道这么理解是对的,所以该函数都应该
                                        //在任务代码最后调用吧,不然其后的语句就不能执行了吧
                                        //为什么原代码里基本都不是这么做的呢,很奇怪,是我错了??
         
        }
}

void Task2(void *pdata)
{
unsigned char err=0;
pdata=pdata;

MCUCR=0x02;
GICR=0x40;

TCCR2=0x08;      // CTC 模式, TOP=OCR2
OCR2=72;         // 7372800/1024/72=100
TCCR2|=0x07;     // 1024分频
TIMSK|=0x80;     // 比较中断使能

PORTA|=(1<<1);
DDRA|=(1<<1);
while(1)
    {        
                               
              OSSemPend(T2sem,0,&err);//如果去掉该语句的话,就是说任务2不
                                     //在依赖信号量,也就是中断0了,此时
                                        //很容易执行任务,说明了框架是可信的
            
                          if(err==OS_NO_ERR)
                {  PORTA&=~(1<<1);      
                  t2++;
                 //如果能点亮的话,至少说明了中断0能进入··
                                 //但是还有可能是由于干扰才进去的
                                 //这可能是为什么总是会抖动的原因
                                 
                                 }      
                          if(err==OS_TIMEOUT)
                        {};
              GIFR|=0x40;//外部中断0写1清标志位,还有之前防止其他中断来打断
                                                 //任务2
         //OSTimeDly(10);         
        }
}

void Task3(void *pdata)
{


pdata=pdata;
//MCUCR|=0x02;
//GICR|=0x40;
while(1)
    {
         t3++;
       
               DDRD|=0x04;//好吧,我承认这是传说中的,我没接触过的软件中断
               PORTD|=0x04;//或者说明一下软件中断的概念
               PORTD&=~0x04;//软中断其实就是一段程序,不是外部设备触发的
                                         //而是程序安排的
         OSTimeDly(4);
        }
}

void Task4(void *pdata)
{
pdata=pdata;

MCUCR|=0x08;
GICR|=0x80;

while(1)
    {
         t4++;
       
               DDRD|=0x08;
               PORTD|=0x08;
               PORTD&=~0x08;         
         OSTimeDly(8);
        }
}

void Task5(void *pdata)
{
unsigned char err=0;
struct msgTask *p=( struct msgTask *)0;

pdata=pdata;

while(1)
    {
               p=( struct msgTask *)OSMboxPend(Tmbox,0,&err);
               
         t5=p->cnt;         
        }
}

int main(void)
{
OSInit();

OSTaskCreate(Task1,0,&Task1Stk[OS_USER_TASK_STK_SIZE-1],1);
OSTaskCreate(Task2,0,&Task2Stk[OS_USER_TASK_STK_SIZE-1],2);
OSTaskCreate(Task3,0,&Task3Stk[OS_USER_TASK_STK_SIZE-1],3);
OSTaskCreate(Task4,0,&Task4Stk[OS_USER_TASK_STK_SIZE-1],5);
OSTaskCreate(Task5,0,&Task5Stk[OS_USER_TASK_STK_SIZE-1],4);

T2sem=OSSemCreate(0);
Tmbox=OSMboxCreate((void *)0);

OSStart();
}

出0入0汤圆

发表于 2010-5-18 15:06:27 | 显示全部楼层
回复【39楼】superwangxue
-----------------------------------------------------------------------

我也有同样的困惑!

出0入0汤圆

发表于 2010-5-18 15:13:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-16 16:35:55 | 显示全部楼层
正在学习uc/os,感谢楼主呀!

出0入0汤圆

发表于 2010-7-16 22:21:03 | 显示全部楼层
mega16资源太小了吧,相对于ucosii来说。

出0入0汤圆

发表于 2010-7-17 18:59:44 | 显示全部楼层
牛人

出0入0汤圆

发表于 2010-7-20 13:48:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-22 22:15:02 | 显示全部楼层
少个文件  编译不能通过?
Object file does not exist: C:\Documents and Settings\Administrator\桌面\一个例子\uCOS2AVR.cof

出0入0汤圆

发表于 2010-7-23 10:07:24 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-26 16:59:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-26 17:29:24 | 显示全部楼层
mark,留待以后学习。

出0入0汤圆

发表于 2010-8-1 22:39:20 | 显示全部楼层
打开了   继续研究~~

出0入0汤圆

发表于 2010-8-13 19:40:06 | 显示全部楼层
回复【39楼】superwangxue
-----------------------------------------------------------------------

我的也是17.4K,试试再压缩一些功能!

出0入0汤圆

发表于 2010-8-17 21:37:54 | 显示全部楼层
回复【58楼】wangshaosh
-----------------------------------------------------------------------
ucos2avr.elf这个文件要用到,把这个文件拷到文件夹里再make一下就行啦!

出0入0汤圆

发表于 2010-8-17 21:48:33 | 显示全部楼层
记号~~

出0入0汤圆

发表于 2010-8-19 11:06:48 | 显示全部楼层
已经将楼主的程序运行起来了。。。。
哈哈哈

出0入0汤圆

发表于 2010-8-19 11:08:30 | 显示全部楼层
接着该如何学习ucos,哪位有实验指导之类的资料呢?安排如何从浅到深学习的实验指导。。。

出0入0汤圆

发表于 2010-8-21 10:08:12 | 显示全部楼层
输入make clean能把所有中间文件和目标文件全部删除掉,这样更容易学习!

出0入0汤圆

发表于 2010-8-21 16:04:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-21 21:13:34 | 显示全部楼层
M32与M16只是RAM和FLASH大小不一样,其它都没有什么差别了,那么这个移植到M16的ucos可以直接用到M32上吧?有没有高手可以帮我确认一下,我是初学者,谢谢。。。

出0入0汤圆

发表于 2010-8-24 13:29:40 | 显示全部楼层
这里的makefile是用什么软件生成的呀,我用avr_studio编译了一下,但没有成功,哪位高手指点一下!

出0入0汤圆

发表于 2010-8-26 15:08:51 | 显示全部楼层
请问
//OS_ENTER_CRITICAL();   
TIMSK&=0xFC;

#if OS_TICKS_PER_SEC <= (F_CPU/1024/256)
#error "OS_TICKS_PER_SEC <  (F_CPU/1024/256) "
#endif

OCR0=F_CPU/1024/OS_TICKS_PER_SEC;
TCNT0=0;


TCCR0=(1<<WGM01)|0x05;//1024分频

TIMSK|=2;
//OS_EXIT_CRITICAL();
这里一开临界工作就不正常,有同志知道是怎么回事吗?谢谢

出0入0汤圆

发表于 2010-8-26 22:12:39 | 显示全部楼层
好像堆栈加大了就正常了,为什么开临界会多占堆栈呢?
刚好这个文件里也正好有一句话“由于RAM有限暂不考虑临界*/”,我想请问一下,关中断怎么会用到更多的堆栈呢?谢谢

出0入0汤圆

发表于 2010-12-5 16:17:15 | 显示全部楼层
我下了楼主的程序后也是PB1接上LED不闪,后来拷了51楼的程序也是不闪,最后终于自己一点点的调试出来了,只改了一个地方,就是把任务1、2、3、4、5的优先级改为5、6、7、9、8了,以前记得看资料的时候说uC/OS-II有64个优先级,但是前四个和后四个优先级不能用,要留给系统,现在我把任务的优先级给改了,就成功了。哈哈哈!!

出0入0汤圆

发表于 2011-3-17 17:30:29 | 显示全部楼层
回复【74楼】289041866
-----------------------------------------------------------------------
有哪位高手能把它转到ICC运行。。。我转了很久都不行。。

出0入0汤圆

发表于 2011-5-15 12:52:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-9 16:15:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 10:52:34 | 显示全部楼层
今天精神不好,先mark下!

出0入0汤圆

发表于 2011-6-22 16:41:42 | 显示全部楼层
非常感谢LZ的分享,这个例子解决了我在汇编混合编程时出现的问题。

出0入0汤圆

发表于 2011-11-3 10:41:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-9 14:34:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-16 10:40:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-30 13:09:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-1 09:40:47 | 显示全部楼层
非常好,记录下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表