
NiosII处理器的启动可采用两种方式: 自动初始化和用户自定义初始化,nios中alt_main 和main的区别也在这里。
如果NiosII处理器自动初始化,ANSI C标准定义应用程序可以通过调用main()来开始执行。在调用main()之前,应用程序假定运行环境和所有的服务系统都被初始化并准备运行。初始化可以被硬件抽象层(HAL)系统库自动执行。程序员不需要考虑系统的输出设备以及如何初始化每一个外设,HAL会自动初始化整个系统。
另外,能使用main函数作为开头开头时cpu可能需要更大的ram( on chip memory )空间。
region onchip_memory_0 is full 这就是提示ram不够,根据程序适当改大一点后就能编译了。
static void handle_Timer_interrupts(void* context, alt_u32 id)
int main (void) __attribute__ ((weak, alias ("alt_main")));
int alt_main (void)
原来是中断控制器没初始化,在alt_main开始加入alt_irq_init (ALT_IRQ_BASE);即搞定了。但是当用main代替alt_main时,不需要alt_irq_init 中断也能运行。
后来才查到:
也就是说在NiosII IDE工程中,只需简单定义alt_main()就可以实现用户的启动顺序,而且能够选择HAL的服务程序。如果应用程序需要一个alt_main()入口点程序,可以复制默认的执行作为开始点,根据要求来定制它。
int alt_main(void)
最简单的例子(ram都设为4k的条件下):
程序1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "system.h"
#include "sys/alt_sys_init.h"
#include "sys/alt_irq.h"
#include "priv/alt_file.h"
int main (void) __attribute__ ((weak, alias ("alt_main")));
int alt_main(void)
{
}
--------这样就没问题,编译能通过!!!!!
如果改成这样:
程序2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "system.h"
#include "sys/alt_sys_init.h"
#include "sys/alt_irq.h"
#include "priv/alt_file.h"
int main(void)
{
return 0;
}
----------编译就不能通过了,提示如下
Console中的提示——————————————————
**** 00000047] overlaps section .exceptions [00000020 -> 00000ab7] overlaps section .exceptions [00000020 -> 00000ccb] overlaps section .text [000001c8 -> 00000ccb] overlaps section .text [000001c8 -> 0000261b]
/cygdrive/d/MyProgram/altera/kits/nios2_60/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.1/http://www.cnblogs.com/http://www.cnblogs.com/nios2-elf/bin/ld section .rodata [00000020 -> 00000047] overlaps section .exceptions [00000020 -> 000001c7]
/cygdrive/d/MyProgram/altera/kits/nios2_60/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.1/http://www.cnblogs.com/http://www.cnblogs.com/nios2-elf/bin/ld section .rwdata [00000048 -> 00000ab7] overlaps section .exceptions [00000020 -> 000001c7]
===========================================
一个问题整了几天,原来源于main()和alt_main()
2007-02-02 09:12
一个计时器中断程序始终跑不起来:
volatile alt_u8 led;
{
}
{
}
alt_irq_init (ALT_IRQ_BASE);
==============================================
nios中alt_main 和main的区别
[ 2007-3-31 21:36:00 | By: caopengly ]
nios中alt_main 和main的区别?
caopengly:
一般程序都只有一个入口地址,main,但是为了程序的初始化方便或利用继承性(c++)中,定义了main的别名,这里的程序入口你可以想象成alt_main()是main()函数的内部隐藏带有驱动的入口。区别看了就知道了。
请看下面的程序
#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude "system.h"
#i nclude "sys/alt_sys_init.h"
#i nclude "sys/alt_irq.h"
#i nclude "priv/alt_file.h"
int main (void) __attribute__ ((weak, alias ("alt_main")));
//extern void _do_ctors(void) ALT_WEAK;
{
}
我也弄了几天,郁闷了几天!!
楼主辛苦了!