万能的ouravr啊,求教uSmartX
我在wingcc下编译通过,就是运行不了。1.移植要用到函数加到哪里啊?(我加到main的文件里)
2.可以用winGCC编译吗?
如何学好嵌入式操作系统,大家有好建议啊 哦,忘了,我用的是M64 整个工程出来看看。 uSmartXosourdev_446571.rar(文件大小:432K) (原文件名:gccavr.rar)
谢谢上官先生。
timers.c是主程序。 点击此处下载 ourdev_446760.rar(文件大小:49K) (原文件名:gccavr.rar)
高优先级任务要主动休眠,低优先级任务才有运行机会。 Thanks. 有想法,并尝试过,不知道如何解释这个现象:
有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闪动,有时都根本不闪。
不是在调度函数那里运行一个任务之后,下次调换才运行下一个任务吗?这种情况如何解释? 看下你的Delay1();函数
4楼有讲:OS的任务里面不要使用for(i=0;i<XXXXXX;i++)这样的代码(大意,原文已删) void Delay1(void)
{
uint16 i,j;
for (i=0; i<2000; i++)
for (j=0; j<1000; j++);
}
GCC开优化,空循环视为无效代码。也就根本没有达到延时效果。
空延时更好的方法是调用GCC延时库函数,或者加上volatile关键字。
这里不该用空等待,应该把自己任务挂起,让其他任务运行。 受教啦! 请问上官先生,是不是我原来的makefile有问题啊?
你的makefile编译出来hex文件怎么小了那么多,你是怎么做到的啊?0 没问题。
CFLAGS+= -ffunction-sections
LDFLAGS += -Wl,--gc-sections
楼主为何要自己手动配置MAKEFILE,而不直接用avr_studio,不用管MAKEFILE的。 这样子啊。
我一直用ouravr的那个范例makefile的,avr_studio有这个的功能?我还得看看。
多谢指点! 可参考
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=839849&bbs_page_no=1&search_mode=1&search_text=WinAVR&bbs_id=1000 对于如何把生成hex文件弄的那么小,还有不了解。
用你的rebuild生成hex文件是6kb,我直接用wingcc生成是12kb。这也省了太多了吧? 原因很简单,
WinAVR 默认是以文件为单位生成段,然后参与连接,有些文件并不是所有函数都用到了,没有被用到的函数也会连接进去。
如果编译以函数为单位生成段,并且连接时把不用的段全部丢弃掉,代码就会减少很多(特别是用OS的时候,且OS大部分内核函数程序中并没有用到)
另外,HEX文件大小不代表实际代码大小。 再次谢过上官先生。 路过。学习。。。
页:
[1]