搜索
bottom↓
回复: 17

万能的ouravr啊,求教uSmartX

[复制链接]

出0入0汤圆

发表于 2009-5-18 20:59:57 | 显示全部楼层 |阅读模式
我在wingcc下编译通过,就是运行不了。
1.移植要用到函数加到哪里啊?(我加到main的文件里)
2.可以用winGCC编译吗?
如何学好嵌入式操作系统,大家有好建议啊

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

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

出0入0汤圆

 楼主| 发表于 2009-5-18 21:00:44 | 显示全部楼层
哦,忘了,我用的是M64

出0入0汤圆

发表于 2009-5-19 13:01:32 | 显示全部楼层
整个工程出来看看。

出0入0汤圆

 楼主| 发表于 2009-5-21 09:28:28 | 显示全部楼层
uSmartXosourdev_446571.rar(文件大小:432K) (原文件名:gccavr.rar)

谢谢上官先生。
timers.c是主程序。

出0入0汤圆

发表于 2009-5-21 23:27:34 | 显示全部楼层
点击此处下载 ourdev_446760.rar(文件大小:49K) (原文件名:gccavr.rar)


高优先级任务要主动休眠,低优先级任务才有运行机会。

出0入0汤圆

 楼主| 发表于 2009-5-22 16:34:21 | 显示全部楼层
Thanks.

出0入0汤圆

 楼主| 发表于 2009-5-22 20:10:40 | 显示全部楼层
有想法,并尝试过,不知道如何解释这个现象:

有3个task,每个控制一LED灯闪动,设置其优先级都是1。 如下:

//PF2
STATUS TSK_Led1(STATUS ucEvent)
{
    PORTF |= (1<<PF2);
        Delay1();
        PORTF &= ~(1<<PF2);
        Delay1();
        PORTF |= (1<<PF2);
        Delay1();
        PORTF &= ~(1<<PF2);
        Delay1();
        PORTF |= (1<<PF2);
    return SYS_OK;
}


//PF1
STATUS TSK_Led2(STATUS ucEvent)
{
    PORTF |= (1<<PF1);
        Delay1();
        PORTF &= ~(1<<PF1);
        Delay1();
        PORTF |= (1<<PF1);
        Delay1();
        PORTF &= ~(1<<PF1);
        Delay1();
        PORTF |= (1<<PF1);   
    return SYS_OK;
}


//PD4
STATUS TSK_Led3(STATUS ucEvent)
{
   PORTD |= (1<<PD4);
        Delay1();
        PORTD &= ~(1<<PD4);
        Delay1();
        PORTD |= (1<<PD4);
        Delay1();
        PORTD &= ~(1<<PD4);
        Delay1();
        PORTD |= (1<<PD4);   
    return SYS_OK;
}

//--------------------------------------------------------------------------------
/*        Task initialisation table must be properly initialized. In this example
*        all task have

equal priority and will be scheduled in round robin fashion.
*/
task_entry_t uSmartXTaskTable[] = {
        {&TSK_Led1,         &TSK_LED1, 1, "LED1"},
        {&TSK_Led2, &TSK_LED2,         1, "LED2"},
        {&TSK_Led3, &TSK_LED3,         1, "LDE3"},
        {0,0,0,""}
};

但是实际上现象:有时只有LED1闪动,有时都根本不闪。
不是在调度函数那里运行一个任务之后,下次调换才运行下一个任务吗?这种情况如何解释?

出0入0汤圆

发表于 2009-5-22 20:19:28 | 显示全部楼层
看下你的Delay1();函数

4楼有讲:OS的任务里面不要使用for(i=0;i<XXXXXX;i++)这样的代码(大意,原文已删)

出0入0汤圆

发表于 2009-5-22 20:23:00 | 显示全部楼层
void Delay1(void)
{
   uint16 i,j;
   for (i=0; i<2000; i++)
   for (j=0; j<1000; j++);
}

GCC开优化,空循环视为无效代码。也就根本没有达到延时效果。
空延时更好的方法是调用GCC延时库函数,或者加上volatile关键字。


这里不该用空等待,应该把自己任务挂起,让其他任务运行。

出0入0汤圆

 楼主| 发表于 2009-5-22 20:53:17 | 显示全部楼层
受教啦!

出0入0汤圆

 楼主| 发表于 2009-5-23 08:36:42 | 显示全部楼层
请问上官先生,是不是我原来的makefile有问题啊?
你的makefile编译出来hex文件怎么小了那么多,你是怎么做到的啊?0

出0入0汤圆

发表于 2009-5-23 09:24:19 | 显示全部楼层
没问题。

CFLAGS  += -ffunction-sections
LDFLAGS += -Wl,--gc-sections


楼主为何要自己手动配置MAKEFILE,而不直接用avr_studio,不用管MAKEFILE的。

出0入0汤圆

 楼主| 发表于 2009-5-23 14:20:04 | 显示全部楼层
这样子啊。

我一直用ouravr的那个范例makefile的,avr_studio有这个的功能?我还得看看。

多谢指点!

出0入0汤圆

发表于 2009-5-24 09:28:35 | 显示全部楼层
可参考
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=839849&bbs_page_no=1&search_mode=1&search_text=WinAVR&bbs_id=1000

出0入0汤圆

 楼主| 发表于 2009-5-25 15:15:55 | 显示全部楼层
对于如何把生成hex文件弄的那么小,还有不了解。

用你的rebuild生成hex文件是6kb,我直接用wingcc生成是12kb。这也省了太多了吧?

出0入0汤圆

发表于 2009-5-26 21:18:28 | 显示全部楼层
原因很简单,
WinAVR 默认是以文件为单位生成段,然后参与连接,有些文件并不是所有函数都用到了,没有被用到的函数也会连接进去。

如果编译以函数为单位生成段,并且连接时把不用的段全部丢弃掉,代码就会减少很多(特别是用OS的时候,且OS大部分内核函数程序中并没有用到)


另外,HEX文件大小不代表实际代码大小。

出0入0汤圆

 楼主| 发表于 2009-5-26 21:40:11 | 显示全部楼层
再次谢过上官先生。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-3 07:41

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

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