打印

我的UCOSII可以在MEGA128上跑了

[复制链接]
4012|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2007-4-5 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
虽然只有三个任务,除任务调度,其他功能全部关闭。
/*
**************************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*
*                                             AVR Sample code
* File        : TEST.C
* By          : Ole Saether
* Version     : V1.01
*
* 2004-05-23 modified by Zhang Yunfeng (yfzhang@ele.pku.edu.cn)
*
* AVR-GCC port version : 1.0     2001-04-02 modified/ported to avr-gcc by Jesper Hansen (jesperh@telia.com)
*
* 2003-06-27 Modification to gcc v. 3.x and uC/OS-II v 2.52 by Julius Luukko (Julius.Luukko@lut.fi).
*            See the file README for details of the changes.
*
*
* Description :
*
*         This file contains a simple example program showing how to use the AVR port of uC/OS-II. It is
*         based on Example #1 from Jean Labrosse's book "MicroC/OS-II, The Real Time Kernel." The main
*         difference is that this example does not display the time of day and the uC/OS-II version number.
*         You must have the AVR UART connected to a VT102 compatible terminal (HyperTerminal in Windows is OK)
*         to get the most out of this example.
*
*         The support routines at the end of this file are included only to make this example run; they should
*         not be used in production code without careful testing.
**************************************************************************************************************
*/

#include "includes.h"

/*
**************************************************************************************************************
*                                               CONSTANTS
**************************************************************************************************************
*/
#define CPU_CLOCK_HZ        7372800      //7.3728Mhz    /* 3686400        3.6864Mhz */
#define UART_BAUD_RATE      115200      /* 9600 baud */
#define UART_BAUD_SELECT (CPU_CLOCK_HZ/(UART_BAUD_RATE*16l)-1)

#define  TASK_STK_SIZE  OS_TASK_DEF_STK_SIZE            /* Size of each task's stacks (# of bytes)          */
#define  N_TASKS        2                               /* Number of identical tasks                        */

/* #define UART_TX_BUF_SIZE 512 */
//#define UART_TX_BUF_SIZE 256
#define S1_XBUFLEN    512
#define S1_RBUFLEN    32
#define S1_DATA UDR1

#define MSG_QUEUE_SIZE 20
/*
**************************************************************************************************************
*                                               VARIABLES
**************************************************************************************************************
*/

OS_STK          TaskStk1[TASK_STK_SIZE];           //Task1 stacks 
OS_STK          TaskStk2[TASK_STK_SIZE];           //Task1 stacks                          
OS_STK          TaskStartStk[TASK_STK_SIZE];
char            TaskData[N_TASKS];                      /* Parameters to pass to each task                  */
static volatile INT8U    S1_xbuf[S1_XBUFLEN];         /* UART transmit buffer        */
static volatile INT16U    S1_xpos;                            /* UART transmit buffer read pointer    */
static volatile INT16U    S1_xcnt;                            /* Number of characters to send         */
static volatile INT8U    S0_rbuf[S1_RBUFLEN];         /* UART receive buffer        */
static volatile INT16U    S1_rpos;                            /* UART receive buffer read pointer    */
static volatile INT16U    S1_rcnt;                            /* Number of characters for read         */
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//我添加的变量
unsigned char test_** =0;

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
/*
**************************************************************************************************************
*                                           FUNCTION PROTOTYPES
**************************************************************************************************************
*/
//$$$$$$$$$$$$$$$$$$$$$$$$$$$
//我的函数

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$

void  Task1(void *data);                                 /* Function prototypes of tasks                     */
void  Task2(void *data); 
void  TaskStart(void *data);                            /* Function prototypes of Startup task              */
void  PutChar(char c);                                  /* Write a character to the AVR UART                */
void  AvrInit(void);                                    /* Initialize AVR                                   */
/*
**************************************************************************************************************
*                                                MAIN
**************************************************************************************************************
*/

int main (void)
{
  AvrInit();                                          /* Initialize the AVR UART and Timer                */
  OSInit();
  OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0);
  OSStart();                                          /* Start multitasking                               */
  return 0;
}

/*
**************************************************************************************************************
*                                              STARTUP TASK
**************************************************************************************************************
*/

void TaskStart (void *data)
{
  data = data;                                        /* Prevent compiler warning                         */
  unsigned char lingt_f = 0;
  OS_ENTER_CRITICAL();
/*   TCCR0=0x05;                                 /\* on some processors other than mega128 *\/ */
  TCCR0=0x07;                                         /* Set TIMER0 prescaler to CLK/1024                 */
  TIMSK=_BV(TOIE0);  //T0溢出中断允许                                   /* Enable TIMER0 overflow interrupt                 */
  TCNT0=256-(CPU_CLOCK_HZ/OS_TICKS_PER_SEC/1024);     /* Set the counter initial value                    */
  OS_EXIT_CRITICAL();
  OSStatInit();                                       /* Initialize uC/OS-II's statistics                 */
    OSTaskCreate(Task1, (void *)0, (void *)&TaskStk1[TASK_STK_SIZE - 1],2);
    OSTaskCreate(Task2, (void *)0, (void *)&TaskStk2[TASK_STK_SIZE - 1],4);

  while(1)
  {
//    lingt_f=(~lingt_f);
//    PORTF = lingt_f;
   /*
        if(lingt_f == 0)
        {
           PORTF |= 0x02;
//          PORTF &= 0xfd;
           lingt_f = 1;
        }   
        if(lingt_f == 1)
        {
//            PORTF |= 0x02;
            PORTF &= 0xfd;
            lingt_f = 0;
        }
    */        
    OSCtxSwCtr = 0;
    OSTimeDlyHMSM(0, 0, 2, 0);                        /* Wait one second                                  */
  }
}

/*
**************************************************************************************************************
*                                                  TASKS
**************************************************************************************************************
*/
void Task1 (void *data)
{
  INT8U err;
  unsigned char lingt_f1 = 0;
//  PORTF &= 0xf7;
  for (;;) 
  {
//  lingt_f1=(~lingt_f1);
//    PORTF = lingt_f1;
    /*
      if(lingt_f1 == 0)
    {
        PORTF |= 0x08;
//      PORTF &= 0xfd;
         lingt_f1 = 1;
    }   
    if(lingt_f1 == 1)
    {
//            PORTF |= 0x02;
            PORTF &= 0xf7;
            lingt_f1 = 0;
    }
    */
    OSTimeDly(100);                                   /* Delay 6 clock ticks                              */
  }
}
//@@@@@@@@@@@@@@
void Task2 (void *data)
{
   INT8U err;
   unsigned char lingt_f2 = 0;
//  PORTF &= 0x7f;

  for (;;) 
  {
    lingt_f2=(~lingt_f2);
    PORTF = lingt_f2;
  /*
      if(lingt_f2 == 0)
    {
        PORTF |= 0x80;
//      PORTF &= 0xfd;
         lingt_f2 = 1;
    }
    if(lingt_f2 == 1)
    {
//            PORTF |= 0x02;
            PORTF &= 0x7f;
            lingt_f2 = 0;
    }
*/    
    OSTimeDly(10);                                   /* Delay 6 clock ticks */
  }
}
//@@@@@@@@@@@@@@@@
void AvrInit (void)
{
//#######################################
  MCUCR=0x00;                       //###zkq modif
  SREG|=0x80;             //全局中断允许
  //##############
  DDRF = 0xff;
  PORTF = 0xff;
}
//===================================================================================

相关帖子

沙发
ayb_ice| | 2007-4-5 16:10 | 只看该作者

随便说说

恭喜你,成功是喜悦的.
大部分AVR RAM不够大,跑UCOS实际意义不大...

使用特权

评论回复
板凳
keer_zu|  楼主 | 2007-4-5 16:15 | 只看该作者

谢谢

我想在实际中使用它,再外扩RAM怎样,MEGA128是4K
我的结果是:
avr-gcc -c -mmcu=atmega128 -I. -If:/Micrium/Software/uCOS-II/Source -If:/Micrium/Software/uCOS-II/Ports/AVR/ATmega128/GNU/jlu -x assembler-with-cpp -Wa,-ahlms=os_cpu_a.lst,-gstabs  f:/Micrium/Software/uCOS-II/Ports/AVR/ATmega128/GNU/jlu/os_cpu_a.asm -o os_cpu_a.o
avr-gcc -mmcu=atmega128 -I. -If:/Micrium/Software/uCOS-II/Source -If:/Micrium/Software/uCOS-II/Ports/AVR/ATmega128/GNU/jlu -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o   os_cpu_c.o ucos_ii.o os_cpu_a.o --output test.elf -Wl,-Map=test.map,--cref -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80feef
avr-objcopy -O ihex -R .eeprom test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex test.elf test.eep
avr-objdump -h -S test.elf > test.lss
Size after:
   text       data        bss        dec        hex    filename
   3268        264       2079       5611       15eb    test.elf
Errors: none
-------- end --------

> Process Exit Code: 0
> Time Taken: 00:01
扩充后可否用于实际中呢?
希望 ayb_ice 和大家多给点意见。
谢谢!!

使用特权

评论回复
地板
ayb_ice| | 2007-4-5 16:37 | 只看该作者

随便说说

  扩展当然可以...

使用特权

评论回复
5
keer_zu|  楼主 | 2007-4-5 16:55 | 只看该作者

谢谢

使用特权

评论回复
6
keer_zu|  楼主 | 2007-4-6 13:50 | 只看该作者

请教

  
在UCOSII中,中断是如何处理的?
我知道:
  ............
  PushRS();
    OSIntEnter();
    if (OSIntNesting == 1)
    OSTCBCur->OSTCBStkPtr = (OS_STK *)SP;
    //以下是中断处理内容
    。。。。。。。
         。。。。。。。
    OSIntExit();
    PopRS();
   ..............
这样一个大概的模式。
但是在使用时要注意什么细节?
还望各位指教。

使用特权

评论回复
7
ayb_ice| | 2007-4-6 13:52 | 只看该作者

UCOS第二版

想要知道UCOS细节,还是要买<<UCOS第二版>>...

使用特权

评论回复
8
keer_zu|  楼主 | 2007-4-6 14:07 | 只看该作者

谢谢ayb_ice

我有书,但是老是感到看了书还不够。

我还有两个问题

一、

还有在我的任务中对器件的驱动能不能用过多的查询方式?

如果用中断,那么怎么安排任务和中断的交互。

二、

如何安排个任务延时挂起的时间长短。最高优先级的挂起时间既要保证

接下来的所有低优先级能够得到执行,还得保证自己的实时性,以便被

及时执行。

请求大家多给点意见。

使用特权

评论回复
9
ayb_ice| | 2007-4-6 14:31 | 只看该作者

随便说说

查询也可以(UCOS是抢先的,只是不是最高任务查询,你可以控制查询间隙)...
中断可以与任务通信(发消息等)...
如果安排任务优先级取决于实际情况,大部分是情况是按消息(广义)驱动方式来工作,但键盘程序等一般是间隙方式即可...
项目如果使用RTOS肯定要保证足够的CPU执行余量...

使用特权

评论回复
10
55953797| | 2007-12-22 09:30 | 只看该作者

Task1到Task2的转换是怎样进行的?

使用特权

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

本版积分规则

1350

主题

12427

帖子

53

粉丝