wuqiushan741826 发表于 2012-6-24 17:32:57

关于 AVR studio ucos-II 的交流

一直想把ucos-II 移植到mega128上,并且用AVR studio软件实现,可是几个月来一直移植不成功,还请各位高手指点,有代码一起交流一下,谢谢

renpeng009 发表于 2012-6-24 17:36:55

gaoxy2008 发表于 2012-6-24 17:55:12

从ucos的官网下载。

wuqiushan741826 发表于 2012-6-24 17:57:01

我找了很久,没有相关studio的,请各位高手指点

hpdell 发表于 2012-6-27 15:10:22

如果有正常的能够在128上面跑起来的也可以,到时可以自己修改成studio的

xjbh001 发表于 2012-6-27 16:03:41

在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

hpdell 发表于 2012-6-28 17:49:50

xjbh001 发表于 2012-6-27 16:03 static/image/common/back.gif
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

你好,请问有没有ucos-ii-iaravr的啊,我现在在研究这个,但是到目前还没有眉目哦!!!!!!111

xjbh001 发表于 2012-6-29 15:13:38

hpdell 发表于 2012-6-28 17:49 static/image/common/back.gif
你好,请问有没有ucos-ii-iaravr的啊,我现在在研究这个,但是到目前还没有眉目哦!!!!!!111 ...

这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助

hpdell 发表于 2012-6-29 17:43:49

xjbh001 发表于 2012-6-29 15:13 static/image/common/back.gif
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助

谢谢了,

wuqiushan741826 发表于 2012-6-29 22:14:22

xjbh001仁兄,请加我QQ:576864273

wuqiushan741826 发表于 2012-6-29 22:14:49

xjbh001 发表于 2012-6-27 16:03 static/image/common/back.gif
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

xjbh001仁兄,请加我QQ:576864273

hpdell 发表于 2012-7-1 12:34:39

xjbh001 发表于 2012-6-29 15:13 static/image/common/back.gif
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助

我改了一个IAR-AVR 的Ucos,只是目前的RAM使用的比较多【3 786 bytes of DATA memory (+ 7 absolute )
】,请问有什么方法可以把它搞小一点啊,

xjbh001 发表于 2012-7-2 11:32:13

hpdell 发表于 2012-7-1 12:34 static/image/common/back.gif
我改了一个IAR-AVR 的Ucos,只是目前的RAM使用的比较多【3 786 bytes of DATA memory (+ 7 absolute )...

可能是你任务分配的堆栈太大了吧,或者是建立任务太多,有些是没有必要的,可以试着减小,

hpdell 发表于 2012-7-2 13:17:16

本帖最后由 hpdell 于 2012-7-2 13:22 编辑

xjbh001 发表于 2012-7-2 11:32 static/image/common/back.gif
可能是你任务分配的堆栈太大了吧,或者是建立任务太多,有些是没有必要的,可以试着减小, ...

你好,我现在修改了一下,使用的data是:



还有就是下面的那个警告该怎么解决啊????????

一运行到 LD   R29,Z+就开始出现警告,一旦出现后,后面所以的运行都会出现了!!!!!!


堆栈设置如下::

xjbh001 发表于 2012-7-3 21:31:30

hpdell 发表于 2012-7-2 13:17 static/image/common/back.gif
你好,我现在修改了一下,使用的data是:




不好意思,这么晚才回复你。
你的堆栈溢出原因是建立的任务太多,堆栈空间不够;
或者是程序中调用了太多的功能,导致堆栈空间不够用,可以把没有用的功能屏蔽掉;

xjbh001 发表于 2012-7-3 21:45:17

hpdell 发表于 2012-7-2 13:17 static/image/common/back.gif
你好,我现在修改了一下,使用的data是:




我的堆栈设置是这样的:
可以参考一下

hpdell 发表于 2012-7-3 22:08:40

本帖最后由 hpdell 于 2012-7-3 22:21 编辑

xjbh001 发表于 2012-7-3 21:45 static/image/common/back.gif
我的堆栈设置是这样的:
可以参考一下

你好,我现在吧DATA减到1.5k左右了,那个警告还是会出现,设置按照你的改了也没有效果,不知道是何故,
还有一个问题就是,我刚开始搞了三个简单的灯的任务让他泡泡,居然跑了36小时也没有死机,但是我把任务的类容加大了,现在只执行第1个任务,2、3的任务他就不执行了,请问是这么回事啊,不过灯的三个任务都是可以执行的,三个灯的任务我使用了这个“

      OSTaskCreateExt(AppTaskStart,
                  (void *)0,
                  (OS_STK *)&AppTaskStartStk,
                  OS_TASK_START_PRIO,
                  OS_TASK_START_PRIO,
                  (OS_STK *)&AppTaskStartStk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
”函数,任务的内容加大后,没有使用了,直接使用了
      BSP_Init();                                  /* Initialize the BSP                                 */
      AppTaskCreate(); 这两个函数,因为使用上面的那个函数系统会重启,请指教指教!!!!!!!!!!!??????????

static voidAppTaskStart (void *p_arg)
{
    (void)p_arg;                                 /* Prevent compiler warnings                        */

    BSP_Init();                                  /* Initialize the BSP                                 */

    AppTaskCreate();

}


staticvoidAppTaskCreate (void)   //三个任务都做里面
{
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    INT8Uerr;
#endif


    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
    OSTaskStkSize   = OS_TASK_1_STK_SIZE;      /* Setup the default stack size                     */
    OSTaskStkSizeHard = OS_TASK_STK_SIZE_HARD;   /* Setup the default hardware stack size            */
    OSTaskCreateExt(AppTask1,
                  (void *)0,
                  (OS_STK *)&AppTask1Stk,
                  OS_TASK_1_PRIO,
                  OS_TASK_1_PRIO,
                  (OS_STK *)&AppTask1Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
   
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
   OSTaskNameSet(OS_TASK_1_PRIO, "Task 1", &err);
#endif

    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
    OSTaskStkSize   = OS_TASK_2_STK_SIZE;      /* Setup the default stack size                     */
    OSTaskStkSizeHard = OS_TASK_STK_SIZE_HARD;   /* Setup the default hardware stack size            */
    OSTaskCreateExt(AppTask2,
                  (void *)0,
                  (OS_STK *)&AppTask2Stk,
                  OS_TASK_2_PRIO,
                  OS_TASK_2_PRIO,
                  (OS_STK *)&AppTask2Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
   
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
   OSTaskNameSet(OS_TASK_2_PRIO, "Task 2", &err);
#endif
   
   
    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
   
   OSTaskStkSize   = OS_TASK_3_STK_SIZE;      // Setup the default stack size                     
    OSTaskStkSizeHard = OS_TASK_STK_SIZE_HARD;   // Setup the default hardware stack size            
    OSTaskCreateExt(AppTask3,
                  (void *)0,
                  (OS_STK *)&AppTask3Stk,
                  OS_TASK_3_PRIO,
                  OS_TASK_3_PRIO,
                  (OS_STK *)&AppTask3Stk,
                  OSTaskStkSize - OSTaskStkSizeHard,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
   
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
   OSTaskNameSet(OS_TASK_3_PRIO, "Task 3", &err);
#endif   
   
}

hpdell 发表于 2012-7-4 09:31:02

xjbh001 发表于 2012-7-3 21:45 static/image/common/back.gif
我的堆栈设置是这样的:
可以参考一下

你好,我想问一下你使用ucos系统时,按键消痘是如何处理的啊?????????

xjbh001 发表于 2012-7-4 18:33:22

hpdell 发表于 2012-7-4 09:31 static/image/common/back.gif
你好,我想问一下你使用ucos系统时,按键消痘是如何处理的啊????????? ...

按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba674.html
根据你上传的有很多警告的图来看,你的问题就是堆栈溢出了,很可能是你建立任务时分配的堆栈空间不够,
堆栈空间分配默认是在app_cfg.h这个文件里面,可以参考下面的截图,试着把堆空间增大,或删除没必要的任务

hpdell 发表于 2012-7-5 11:22:17

xjbh001 发表于 2012-7-4 18:33 static/image/common/back.gif
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba67 ...

多谢你的指教啊,

hpdell 发表于 2012-7-6 11:57:11

xjbh001 发表于 2012-7-4 18:33 static/image/common/back.gif
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba67 ...

你好,我还有个问题想请教一下你,就是我使用IIC的功能,在没有上UCOS系统时,运行时很正常的,但是上了UCOS系统后,at24c02就不能够读写了,但是其他的IIC芯片都可以正常的读写,
请问,这个问题有什么方法可以解决啊???????

IIC我使用的是硬件的IIC程序,AVR芯片的。硬件的IIC的时钟频率设置是250khz,

xjbh001 发表于 2012-7-6 23:10:08

hpdell 发表于 2012-7-6 11:57 static/image/common/back.gif
你好,我还有个问题想请教一下你,就是我使用IIC的功能,在没有上UCOS系统时,运行时很正常的,但是上了U ...

不是很清楚你说的“其他的IIC芯片”是指什么,是不是和at24c02一样,用AVR的TWI,还是单独的软件模拟时序,
无法读写一般跟时序有关,还有就是注意IO口的方向,与是不是UCOS系统没关系的,除非是你的UCOS本身没跑起来。

hpdell 发表于 2012-7-7 08:53:39

本帖最后由 hpdell 于 2012-7-7 08:56 编辑

xjbh001 发表于 2012-7-6 23:10 static/image/common/back.gif
不是很清楚你说的“其他的IIC芯片”是指什么,是不是和at24c02一样,用AVR的TWI,还是单独的软件模拟时序 ...


你好,ucos是跑起来了,能够正常的读写ds3231、si4730的IIC芯片,但是对at24c02的芯片就只能读是正常的,写就不行了;
采用AVR的硬件ICC程序,也就是AVR的TWI功能。AT24C02、ds3231、si4730都是共用时钟线与数据线的,以前没有跑ucos系统时,对
at24c02、ds3231、si4730都是能够正常的读写操作的。

还有就是是不是因为24c02本身的速度比较慢造成的???

hpdell 发表于 2012-7-7 11:02:02

本帖最后由 hpdell 于 2012-7-7 11:53 编辑

xjbh001 发表于 2012-7-6 23:10 static/image/common/back.gif
不是很清楚你说的“其他的IIC芯片”是指什么,是不是和at24c02一样,用AVR的TWI,还是单独的软件模拟时序 ...

你好,已经搞定了,我把OSTimeDlyHMSM (0,0,0,200); 这个设置为200就可以了,但是我目前还不知道这个200到底是延时多长时间,

unsigned char IIC_Write24C02_Time(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)
{
        I2C_Start();
               
        I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE);//保证写控制位正确,写入器件地址
        I2C_SendDat(wordAdr);//从地址当作一般数据发送       
        I2C_SendDat(dat);
       
        I2CStop();
        OSTimeDlyHMSM (0,0,0,8);           //以前没有跑系统时,延时是3ms
return I2C_CRR;
}

还有就是这个OSTimeDlyHMSM 的ms延时好像不准??????

xjbh001 发表于 2012-7-9 09:05:08

hpdell 发表于 2012-7-7 11:02 static/image/common/back.gif
你好,已经搞定了,我把OSTimeDlyHMSM (0,0,0,200); 这个设置为200就可以了,但是我目前还不知道这个200 ...

OSTimeDlyHMSM (0,0,0,200); 中的200是指200ms,前面依次是秒,分,时。
这个时间是以系统的基准时钟(一般设置为5ms)为准,小于基准时钟系统就无法正常运行,你说的OSTimeDlyHMSM (0,0,0,8),实际延时3ms,小于了系统时钟,
导致这个任务不能正常运行。所以说OSTimeDlyHMSM (0,0,0,5);中,最后一项必须为>=5的数值,
至于为什么写了8,但延时为3ms,也就是说你认为OSTimeDlyHMSM函数延时不准,是因为你的系统基准时钟设置不正确(这个延时的确是不准确的,但对于时间
要求不太高的任务来说也够准确了,不会差很多的),系统时钟要用定时器设置才好。
系统时钟最小单位为一个ticks,计算方式在文件os_time,OSTimeDlyHMSM函数里面;而参数设置在文件os_cfg.h里,#define OS_TICKS_PER_SEC 200项是指1秒
内系统产生了多少次时钟中断,如200是指系统5ms中断一次。

可能说得不太明确,但大致是这样,具体的你要细细看书了,很多是要靠自己理解和实践总结的。

hpdell 发表于 2012-7-9 12:06:50

本帖最后由 hpdell 于 2012-7-9 14:04 编辑

xjbh001 发表于 2012-7-9 09:05 static/image/common/back.gif
OSTimeDlyHMSM (0,0,0,200); 中的200是指200ms,前面依次是秒,分,时。
这个时间是以系统的基准时钟(一 ...

你好,你说的这个,我目前似乎有些明白了哦。


#defineCPU_CLK_FREQ                  16000000L
#define OS_TICKS_PER_SEC      200u   //5ms的定时器中断,那现在就是OS_TICKS_PER_SEC* 5 = 1s 【这个地方以前是100,也是5m中断】

staticvoidBSP_InitTickISR (void)
{
    INT32Unum;
    INT32Udenom;
   
      //---------------下面是16MHz时的设置,5mS
    TCCR0= 0x0F;                                           // Set TIMER0 prescaler to CTC Mode, CLK/1024               
    TCNT0= 0x00;                                           // Start TCNT at 0 for a new cycle                        
    num    = (INT32U)CPU_CLK_FREQ;
    denom= 2 * 1024 * (INT32U)OS_TICKS_PER_SEC;            // 1024 表示是时钟进行1024分频的
    OCR0   = (INT8U)((2 * num / denom ) / 1 - 1);         // 16MHz时,定时时间是5mS,OCR0=0x4D      
    TIFR|= 0x02;                                           // ClearTIMER0 compare Interrupt Flag                     
    TIMSK |= 0x02;                                           // Enable TIMER0 compare Interrupt

}


INT8UOSTimeDlyHMSM (INT8U   hours,
                      INT8U   minutes,
                      INT8U   seconds,
                      INT16Ums)
{
    volatile INT32U ticks;


    if (OSIntNesting > 0u) {                     // See if trying to call from an ISR                  
      return (OS_ERR_TIME_DLY_ISR);
    }
    if (OSLockNesting > 0u) {                  // See if called with scheduler locked               
      return (OS_ERR_SCHED_LOCKED);
    }
#if OS_ARG_CHK_EN > 0u
    if (hours == 0u) {
      if (minutes == 0u) {
            if (seconds == 0u) {
                if (ms == 0u) {
                  return (OS_ERR_TIME_ZERO_DLY);
                }
            }
      }
    }
    if (minutes > 59u) {
      return (OS_ERR_TIME_INVALID_MINUTES);    // Validate arguments to be within range            
    }
    if (seconds > 59u) {
      return (OS_ERR_TIME_INVALID_SECONDS);
    }
    if (ms > 999u) {
      return (OS_ERR_TIME_INVALID_MS);
    }
#endif
                                                 // Compute the total number of clock ticks required..
                                                 // .. (rounded to the nearest tick)                  
    ticks = ((INT32U)hours * 3600uL + (INT32U)minutes * 60uL + (INT32U)seconds) * OS_TICKS_PER_SEC
          + OS_TICKS_PER_SEC * ((INT32U)ms + 500uL / OS_TICKS_PER_SEC) / 1000uL;
    OSTimeDly(ticks);
    return (OS_ERR_NONE);
}


OSTimeDlyHMSM (0,0,0,5);    //这个5现在就表示是5ms了?还有这个ms的数值,最低要>=5 , 你说的是这个意思吧???

OSTimeDlyHMSM (0,0,0,7);    //7表示是延时也是5ms ??
OSTimeDlyHMSM (0,0,0,8);    //8或者是10,表示延时是10ms , ??? 如果是这么回事的话,那我就明白了这个函数的用法了!!!!!!!!! 如果不是还请指教!!!?



xjbh001 发表于 2012-7-9 16:17:55

hpdell 发表于 2012-7-9 12:06 static/image/common/back.gif
你好,你说的这个,我目前似乎有些明白了哦。




是这么计算的,但这样不太合理,而且相对来说不是那么精确,最好是用定时器给系统提供时钟,你可以试着做一下。
OSTimeDlyHMSM (0,0,0,ms),中的ms最小为5,也就是说小于5的也是5ms,但系统本身运行也需要时间(约5ms),如果小于5ms,系统没有起来,所以会有异常。
大于5时,ms为6就是6ms,8就是8ms,依次类推。
但如果用OSTimeDly(ms);这个函数,其中的ms是5ms的倍数,OSTimeDly(1);是5ms,OSTimeDly(2);是10ms。

hpdell 发表于 2012-7-9 16:52:09

xjbh001 发表于 2012-7-9 16:17 static/image/common/back.gif
是这么计算的,但这样不太合理,而且相对来说不是那么精确,最好是用定时器给系统提供时钟,你可以试着做 ...

你好,我现在明白了,非常感谢你的耐心解答啊!!!!!!!!!!!!

unicon911 发表于 2014-4-17 09:34:30

xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

非常感谢,移植cosiii参考

飞鱼爱上鸟 发表于 2014-4-17 10:05:24

学习一下

lujian19871214 发表于 2014-6-4 11:17:23

xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

请教一下,为什么工程文件中只包含了以下文件

main函数中不是调用了OSInit吗?为什么没有将os_core添加在工程文件中,我增加该文件编译反而报错,为什么???

lujian19871214 发表于 2014-6-4 12:59:32

xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

找到原因了,在文件ucos-ii.c文件中都包含进去了~~~~~~~

杨遥 发表于 2014-9-10 16:16:35

学习了,好东东!!!
页: [1]
查看完整版本: 关于 AVR studio ucos-II 的交流