搜索
bottom↓
回复: 32

关于 AVR studio ucos-II 的交流

[复制链接]

出0入0汤圆

发表于 2012-6-24 17:32:57 | 显示全部楼层 |阅读模式
一直想把ucos-II 移植到mega128上,并且用AVR studio软件实现,可是几个月来一直移植不成功,还请各位高手指点,有代码一起交流一下,谢谢

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-6-24 17:36:55 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-24 17:55:12 | 显示全部楼层
从ucos的官网下载。

出0入0汤圆

 楼主| 发表于 2012-6-24 17:57:01 | 显示全部楼层
我找了很久,没有相关studio的,请各位高手指点

出0入0汤圆

发表于 2012-6-27 15:10:22 | 显示全部楼层
如果有正常的能够在128上面跑起来的也可以,到时可以自己修改成studio的

出0入0汤圆

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-28 17:49:50 | 显示全部楼层
xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

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

出0入0汤圆

发表于 2012-6-29 15:13:38 | 显示全部楼层
hpdell 发表于 2012-6-28 17:49
你好,请问有没有ucos-ii-iaravr的啊,我现在在研究这个,但是到目前还没有眉目哦!!!!!!111 ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-29 17:43:49 | 显示全部楼层
xjbh001 发表于 2012-6-29 15:13
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助

谢谢了,

出0入0汤圆

 楼主| 发表于 2012-6-29 22:14:22 | 显示全部楼层
xjbh001仁兄,  请加我QQ:576864273

出0入0汤圆

 楼主| 发表于 2012-6-29 22:14:49 | 显示全部楼层
xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

xjbh001仁兄,  请加我QQ:576864273

出0入0汤圆

发表于 2012-7-1 12:34:39 | 显示全部楼层
xjbh001 发表于 2012-6-29 15:13
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助

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

出0入0汤圆

发表于 2012-7-2 11:32:13 | 显示全部楼层
hpdell 发表于 2012-7-1 12:34
我改了一个IAR-AVR 的Ucos,只是目前的RAM使用的比较多【  3 786 bytes of DATA memory (+ 7 absolute )  ...

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

出0入0汤圆

发表于 2012-7-2 13:17:16 | 显示全部楼层
本帖最后由 hpdell 于 2012-7-2 13:22 编辑
xjbh001 发表于 2012-7-2 11:32
可能是你任务分配的堆栈太大了吧,或者是建立任务太多,有些是没有必要的,可以试着减小, ...


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



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

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


堆栈设置如下::

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-3 21:31:30 | 显示全部楼层
hpdell 发表于 2012-7-2 13:17
你好,我现在修改了一下,使用的data是:

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

出0入0汤圆

发表于 2012-7-3 21:45:17 | 显示全部楼层
hpdell 发表于 2012-7-2 13:17
你好,我现在修改了一下,使用的data是:

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-3 22:08:40 | 显示全部楼层
本帖最后由 hpdell 于 2012-7-3 22:21 编辑
xjbh001 发表于 2012-7-3 21:45
我的堆栈设置是这样的:
可以参考一下


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

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

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

    BSP_Init();                                  /* Initialize the BSP                                 */

    AppTaskCreate();

}


static  void  AppTaskCreate (void)   //三个任务都做里面
{
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    INT8U  err;
#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[OSTaskStkSize - 1],
                    OS_TASK_1_PRIO,
                    OS_TASK_1_PRIO,
                    (OS_STK *)&AppTask1Stk[OSTaskStkSizeHard],
                    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[OSTaskStkSize - 1],
                    OS_TASK_2_PRIO,
                    OS_TASK_2_PRIO,
                    (OS_STK *)&AppTask2Stk[OSTaskStkSizeHard],
                    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[OSTaskStkSize - 1],
                    OS_TASK_3_PRIO,
                    OS_TASK_3_PRIO,
                    (OS_STK *)&AppTask3Stk[OSTaskStkSizeHard],
                    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   
   
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-4 09:31:02 | 显示全部楼层
xjbh001 发表于 2012-7-3 21:45
我的堆栈设置是这样的:
可以参考一下

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

出0入0汤圆

发表于 2012-7-4 18:33:22 | 显示全部楼层
hpdell 发表于 2012-7-4 09:31
你好,我想问一下你使用ucos系统时,按键消痘是如何处理的啊????????? ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-7-5 11:22:17 | 显示全部楼层
xjbh001 发表于 2012-7-4 18:33
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba67 ...

多谢你的指教啊,

出0入0汤圆

发表于 2012-7-6 11:57:11 | 显示全部楼层
xjbh001 发表于 2012-7-4 18:33
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba67 ...

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

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

出0入0汤圆

发表于 2012-7-6 23:10:08 | 显示全部楼层
hpdell 发表于 2012-7-6 11:57
你好,我还有个问题想请教一下你,就是我使用IIC的功能,在没有上UCOS系统时,运行时很正常的,但是上了U ...

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

出0入0汤圆

发表于 2012-7-7 08:53:39 | 显示全部楼层
本帖最后由 hpdell 于 2012-7-7 08:56 编辑
xjbh001 发表于 2012-7-6 23:10
不是很清楚你说的“其他的IIC芯片”是指什么,是不是和at24c02一样,用AVR的TWI,还是单独的软件模拟时序 ...



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

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

出0入0汤圆

发表于 2012-7-7 11:02:02 | 显示全部楼层
本帖最后由 hpdell 于 2012-7-7 11:53 编辑
xjbh001 发表于 2012-7-6 23:10
不是很清楚你说的“其他的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延时好像不准??????

出0入0汤圆

发表于 2012-7-9 09:05:08 | 显示全部楼层
hpdell 发表于 2012-7-7 11:02
你好,已经搞定了,我把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中断一次。

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

出0入0汤圆

发表于 2012-7-9 12:06:50 | 显示全部楼层
本帖最后由 hpdell 于 2012-7-9 14:04 编辑
xjbh001 发表于 2012-7-9 09:05
OSTimeDlyHMSM (0,0,0,200); 中的200是指200ms,前面依次是秒,分,时。
这个时间是以系统的基准时钟(一 ...


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


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

static  void  BSP_InitTickISR (void)
{
    INT32U  num;
    INT32U  denom;
   
        //---------------下面是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;                                           // Clear  TIMER0 compare Interrupt Flag                     
    TIMSK |= 0x02;                                           // Enable TIMER0 compare Interrupt  

}


INT8U  OSTimeDlyHMSM (INT8U   hours,
                      INT8U   minutes,
                      INT8U   seconds,
                      INT16U  ms)
{
    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 , ??? 如果是这么回事的话,那我就明白了这个函数的用法了!!!!!!!!! 如果不是还请指教!!!?

  

出0入0汤圆

发表于 2012-7-9 16:17:55 | 显示全部楼层
hpdell 发表于 2012-7-9 12:06
你好,你说的这个,我目前似乎有些明白了哦。

是这么计算的,但这样不太合理,而且相对来说不是那么精确,最好是用定时器给系统提供时钟,你可以试着做一下。
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。

出0入0汤圆

发表于 2012-7-9 16:52:09 | 显示全部楼层
xjbh001 发表于 2012-7-9 16:17
是这么计算的,但这样不太合理,而且相对来说不是那么精确,最好是用定时器给系统提供时钟,你可以试着做 ...

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

出0入0汤圆

发表于 2014-4-17 09:34:30 | 显示全部楼层
xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

非常感谢,移植cosiii参考

出0入0汤圆

发表于 2014-4-17 10:05:24 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-6-4 11:17:23 | 显示全部楼层
xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-4 12:59:32 | 显示全部楼层
xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 14:08

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

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