关于 AVR studio ucos-II 的交流
一直想把ucos-II 移植到mega128上,并且用AVR studio软件实现,可是几个月来一直移植不成功,还请各位高手指点,有代码一起交流一下,谢谢 从ucos的官网下载。 我找了很久,没有相关studio的,请各位高手指点 如果有正常的能够在128上面跑起来的也可以,到时可以自己修改成studio的在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改 xjbh001 发表于 2012-6-27 16:03 static/image/common/back.gif
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改
你好,请问有没有ucos-ii-iaravr的啊,我现在在研究这个,但是到目前还没有眉目哦!!!!!!111 hpdell 发表于 2012-6-28 17:49 static/image/common/back.gif
你好,请问有没有ucos-ii-iaravr的啊,我现在在研究这个,但是到目前还没有眉目哦!!!!!!111 ...
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助 xjbh001 发表于 2012-6-29 15:13 static/image/common/back.gif
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助
谢谢了, xjbh001仁兄,请加我QQ:576864273 xjbh001 发表于 2012-6-27 16:03 static/image/common/back.gif
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改
xjbh001仁兄,请加我QQ:576864273 xjbh001 发表于 2012-6-29 15:13 static/image/common/back.gif
这个是IAR所用的汇编文件,其它的文件都是相同的,希望对你有帮助
我改了一个IAR-AVR 的Ucos,只是目前的RAM使用的比较多【3 786 bytes of DATA memory (+ 7 absolute )
】,请问有什么方法可以把它搞小一点啊,
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:22 编辑
xjbh001 发表于 2012-7-2 11:32 static/image/common/back.gif
可能是你任务分配的堆栈太大了吧,或者是建立任务太多,有些是没有必要的,可以试着减小, ...
你好,我现在修改了一下,使用的data是:
还有就是下面的那个警告该怎么解决啊????????
一运行到 LD R29,Z+就开始出现警告,一旦出现后,后面所以的运行都会出现了!!!!!!
堆栈设置如下::
hpdell 发表于 2012-7-2 13:17 static/image/common/back.gif
你好,我现在修改了一下,使用的data是:
不好意思,这么晚才回复你。
你的堆栈溢出原因是建立的任务太多,堆栈空间不够;
或者是程序中调用了太多的功能,导致堆栈空间不够用,可以把没有用的功能屏蔽掉; hpdell 发表于 2012-7-2 13:17 static/image/common/back.gif
你好,我现在修改了一下,使用的data是:
我的堆栈设置是这样的:
可以参考一下 本帖最后由 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
} xjbh001 发表于 2012-7-3 21:45 static/image/common/back.gif
我的堆栈设置是这样的:
可以参考一下
你好,我想问一下你使用ucos系统时,按键消痘是如何处理的啊????????? hpdell 发表于 2012-7-4 09:31 static/image/common/back.gif
你好,我想问一下你使用ucos系统时,按键消痘是如何处理的啊????????? ...
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba674.html
根据你上传的有很多警告的图来看,你的问题就是堆栈溢出了,很可能是你建立任务时分配的堆栈空间不够,
堆栈空间分配默认是在app_cfg.h这个文件里面,可以参考下面的截图,试着把堆空间增大,或删除没必要的任务
xjbh001 发表于 2012-7-4 18:33 static/image/common/back.gif
按键消抖你可以看看这个网站,例子很好,通用强,
http://wenku.baidu.com/view/f3987a1ffad6195f312ba67 ...
多谢你的指教啊, 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, 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: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: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延时好像不准?????? 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 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 , ??? 如果是这么回事的话,那我就明白了这个函数的用法了!!!!!!!!! 如果不是还请指教!!!?
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。 xjbh001 发表于 2012-7-9 16:17 static/image/common/back.gif
是这么计算的,但这样不太合理,而且相对来说不是那么精确,最好是用定时器给系统提供时钟,你可以试着做 ...
你好,我现在明白了,非常感谢你的耐心解答啊!!!!!!!!!!!! xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改
非常感谢,移植cosiii参考 学习一下 xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改
请教一下,为什么工程文件中只包含了以下文件
main函数中不是调用了OSInit吗?为什么没有将os_core添加在工程文件中,我增加该文件编译反而报错,为什么??? xjbh001 发表于 2012-6-27 16:03
在Studio GCC环境下能正常运行,只是里面好多配置不合理,用的时候自己修改
找到原因了,在文件ucos-ii.c文件中都包含进去了~~~~~~~ 学习了,好东东!!!
页:
[1]