首页 | 供应信息 | 采购信息 | PDF资料 | 技术资料 | 行业资讯 | 产品展示 | 人才市场 进入会员区
   技术文章分类:单片机/DSP 嵌入式系统 测试仪表 电源技术 接口电路 存储器 传感与控制 通信网络 无线通信 模拟技术 显示与光电 EDA/PLD 汽车电子 消费电子 电子综合
   电子综合工具:PDF资料大全 电子缩略语 IC型号替换 IC厂家 电子电路图 技术参数 设计应用 解决方案
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
  您所在的位置: IC37首页 > 技术问答 > 单片机 > 我的UCOSII可以在MEGA128上跑了

  我的UCOSII可以在MEGA128上跑了 

虽然只有三个任务,除任务调度,其他功能全部关闭。

/*

**************************************************************************************************************

*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.02001-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_HZ7372800//7.3728Mhz/* 36864003.6864Mhz */

#define UART_BAUD_RATE115200/* 9600 baud */

#define UART_BAUD_SELECT (CPU_CLOCK_HZ/(UART_BAUD_RATE*16l)-1)

#defineTASK_STK_SIZEOS_TASK_DEF_STK_SIZE/* Size of each task's stacks (# of bytes)*/

#defineN_TASKS2/* Number of identical tasks*/

/* #define UART_TX_BUF_SIZE 512 */

//#define UART_TX_BUF_SIZE 256

#define S1_XBUFLEN512

#define S1_RBUFLEN32

#define S1_DATA UDR1

#define MSG_QUEUE_SIZE 20

/*

**************************************************************************************************************

*VARIABLES

**************************************************************************************************************

*/

OS_STKTaskStk1[TASK_STK_SIZE];//Task1 stacks

OS_STKTaskStk2[TASK_STK_SIZE];//Task1 stacks

OS_STKTaskStartStk[TASK_STK_SIZE];

charTaskData[N_TASKS];/* Parameters to pass to each task*/

static volatile INT8US1_xbuf[S1_XBUFLEN];/* UART transmit buffer*/

static volatile INT16US1_xpos;/* UART transmit buffer read pointer*/

static volatile INT16US1_xcnt;/* Number of characters to send*/

static volatile INT8US0_rbuf[S1_RBUFLEN];/* UART receive buffer*/

static volatile INT16US1_rpos;/* UART receive buffer read pointer*/

static volatile INT16US1_rcnt;/* Number of characters for read*/

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

//我添加的变量

unsigned char test_flg =0;

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

/*

**************************************************************************************************************

*FUNCTION PROTOTYPES

**************************************************************************************************************

*/

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

//我的函数

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

voidTask1(void *data);/* Function prototypes of tasks*/

voidTask2(void *data);

voidTaskStart(void *data);/* Function prototypes of Startup task*/

voidPutChar(char c);/* Write a character to the AVR UART*/

voidAvrInit(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;

}

//===================================================================================


作者:keer_zu  2007-4-5 16:06:00

  回复1  随便说说124164

恭喜你,成功是喜悦的.

大部分AVR RAM不够大,跑UCOS实际意义不大...


作者:ayb_ice  2007-4-5 16:10:00

  回复2  谢谢124165

我想在实际中使用它,再外扩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,-gstabsf:/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.oos_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:

textdatabssdechexfilename

32682642079561115ebtest.elf

Errors: none

-------- end --------

> Process Exit Code: 0

> Time Taken: 00:01

扩充后可否用于实际中呢?

希望 ayb_ice 和大家多给点意见。

谢谢!!


作者:keer_zu  2007-4-5 16:15:00

  回复3  随便说说124166

扩展当然可以...


作者:ayb_ice  2007-4-5 16:37:00

  回复4  谢谢124167

谢谢
作者:keer_zu  2007-4-5 16:55:00

  回复5  请教124168

在UCOSII中,中断是如何处理的?

我知道:

............

PushRS();

OSIntEnter();

if (OSIntNesting == 1)

OSTCBCur->OSTCBStkPtr = (OS_STK *)SP;

//以下是中断处理内容

。。。。。。。

。。。。。。。

OSIntExit();

PopRS();

..............

这样一个大概的模式。

但是在使用时要注意什么细节?

还望各位指教。


作者:keer_zu  2007-4-6 13:50:00

  回复6  UCOS第二版124169

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


作者:ayb_ice  2007-4-6 13:52:00

  回复7  谢谢ayb_ice124170

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

我还有两个问题

一、

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

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

二、

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

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

及时执行。

请求大家多给点意见。


作者:keer_zu  2007-4-6 14:07:00

  回复8  随便说说124171

查询也可以(UCOS是抢先的,只是不是最高任务查询,你可以控制查询间隙)...

中断可以与任务通信(发消息等)...

如果安排任务优先级取决于实际情况,大部分是情况是按消息(广义)驱动方式来工作,但键盘程序等一般是间隙方式即可...

项目如果使用RTOS肯定要保证足够的CPU执行余量...


作者:ayb_ice  2007-4-6 14:31:00

  回复9  Task1到Task2的转换是怎样进行的?124172

Task1到Task2的转换是怎样进行的?
作者:55953797  2007-12-22 9:30:00


我要投稿 注册会员
客服咨询热线:0755-26000950 0755-26007355
 相关技术问答
·有没有超过32个IO口的5..  2007-4-4
·为什么Protel 99 ..  2007-4-4
·寻找256K~512K B..  2007-4-4
·请问液晶显示模块的几个问题  2007-4-4
·可怕!488通讯网络突然崩..  2007-4-5
·请问为什么电源部分并那么多..  2007-4-5
·有谁在MEGA128上用过..  2007-4-5
·keil+伟福s51仿真时..  2007-4-5
·受中断控制p1.1口输出三..  2007-4-5
·问大家一下,有没有和CD4..  2007-4-5
·51单片机系统掉电重起后全..  2007-4-5
·请教有哪种8051单片机自..  2007-4-5
·51单片机xdata的问题..  2007-4-5
·keil c51中RAM的..  2007-4-5
·用C51检测电话忙音  2007-4-5
·请问这个分时渐变功能怎样实..  2007-4-5
·全面转AVR了,经过一段时..  2007-4-5
·请教各位朋友:单片机的AD..  2007-4-5
·求助!!用MCS51做一个..  2007-4-5
·一个关于单片机通信的问题(..  2007-4-5
·帮忙指点一下做数字频率计怎..  2007-4-5
·找人!  2007-4-5
·stc是不是快死了  2007-4-5
·求教  2007-4-5
·[转贴]悟空,CRC原来是..  2007-4-5
·请教一下关于TTL和CMO..  2007-4-6
·大家加密一般是用什么MCU?  2007-4-6
 
 热门IC
TA2068  LT1809CS8  M51970L  MAX1709ESE  MC68L11D0CFB2  MIG30J103H  QD8243  MUR420RLG  MIC2954-03BZ  FW82452GX  AN5436  AS373  OP11FY  MAX4246AUA  74F245SJ  CY7C131-15JC  DS1005S-150  LT1920IS8  ET6060DOA  70058FB  MC74LCX02DT  75189  UC2852D  MAX212EAG  DM74ALS153N  CY7C453-20JC  XC4013-4PQ240C  XCV200E-6CS144C  CNY172  KA324A  MOC217R2M  KBU8D  ML926  PCI2040GGU  MBM27256-20  MCT26  SVM7962COA  MC10H350FNR2  XC95144PQ160  AN7293NSC  P8228  MG200Q2YS40  MP6753  AD8561ARU  AMP03BJ  PEB22617  CLC942AI  AM2149-45DC  TLC3704  S3C2510A01