版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
NiosII处理器的启动可采用两种方式: 自动初始化和用户自定义初始化,nios中alt_main 和main的区别也在这里。
! z* A _( h# D, M9 U9 a- w/ b' t如果NiosII处理器自动初始化,ANSI C标准定义应用程序可以通过调用main()来开始执行。在调用main()之前,应用程序假定运行环境和所有的服务系统都被初始化并准备运行。初始化可以被硬件抽象层(HAL)系统库自动执行。程序员不需要考虑系统的输出设备以及如何初始化每一个外设,HAL会自动初始化整个系统。
5 D/ a7 h, n/ W: n" T1 U- i 如果用户要避免自动初始化。ANSI C标准将提供了一个可变的入口点程序,定义程序员能手动初始化任何所用的硬件。alt_main()函数提供了一个独立式的编程环境,能够完全控制系统的初始化。例如用alt_irq_init (ALT_IRQ_BASE)函数初始化中断控制器。具体方法在例程hello_alt_main中能找到。" F* G& Y" t8 G, @- w4 y3 I& }
另外,能使用main函数作为开头开头时cpu可能需要更大的ram( on chip memory )空间。最简单的例子(ram都设为4k的条件下):
) E* l- @: A! I' l6 h7 ]' y程序1:7 F% Z8 Q$ G6 F- [6 z
#include <stdio.h>
1 _' u) H1 C6 `! v* {% ]#include <stdlib.h>
6 D0 n% G. h G" X( E: l#include <string.h>* w: M- Y, k R2 |5 `
#include "system.h"
) J+ G z+ b3 C/ A" p#include "sys/alt_sys_init.h"
9 [0 i2 ?; \# s#include "sys/alt_irq.h"% m* @" u0 I+ O3 b
#include "priv/alt_file.h") Z1 j4 v7 N: `: ^! g' S
int main (void) __attribute__ ((weak, alias ("alt_main")));
" Y. E5 X6 E* q j+ ^8 T' Rint alt_main(void)
2 c, t6 {0 r4 ~7 u/ o3 y/ a{
2 W! _# y% B0 G; ?5 h. X+ a alt_irq_init (ALT_IRQ_BASE);
/ C% c0 }' U& u3 Y alt_sys_init();8 \9 y( D/ J7 `3 S0 E
alt_io_redirect (ALT_STDOUT, ALT_STDIN, ALT_STDERR);
; v" A& t! M* b% R) T) e6 s' f int i;
- k t) j' g' w i=1;) Z9 n& U, i' W D2 K5 {4 U' V, K
return 0;" E M& B$ w' k0 K
}* L8 {) Q- w/ Z
--------这样就没问题,编译能通过!!!!!; G7 c0 @8 M5 M- b& t5 d
如果改成这样:. }' s Q! L3 Y5 N' d E
程序2 $ s! N, c! X' Q" u& t4 R
#include <stdio.h>
% n3 y0 V: f0 ]! ^- N2 O#include <stdlib.h>4 O' D# A/ `4 \7 j2 t
#include <string.h>" M; r9 V9 P0 @5 x
#include "system.h"9 s' Q5 [/ E) _( P6 q
#include "sys/alt_sys_init.h": [) ~( e& J# F/ @7 a7 l
#include "sys/alt_irq.h"
- T0 R. k9 H' U& h) L t' q#include "priv/alt_file.h"# z& ^$ d$ a8 F& J8 V* R5 s% G) c8 P
int main(void)3 U5 q& x% a* n
{
$ Y% `; k& \# V7 C" ?' c int i;
5 U% M r8 D- O9 z' X' f0 H i=1;
2 l! ?& N9 v9 M$ K; u1 u: greturn 0;
( k+ B* u% W+ j, X& O8 C( N}( z* S! H ^8 s5 Y6 `6 }
----------编译就不能通过了,提示如下
; S; k' v8 K4 n$ p# n( p) w! B; AConsole中的提示——————————————————
2 X7 S2 u6 N7 l/ p; p2 U7 c/ |9 W- m**** 00000047] overlaps section .exceptions [00000020 -> 00000ab7] overlaps section .exceptions [00000020 -> 00000ccb] overlaps section .text [000001c8 -> 00000ccb] overlaps section .text [000001c8 -> 0000261b]9 D J0 {7 I! }/ a- |7 c
/cygdrive/d/MyProgram/altera/kits/nios2_60/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.1/../../../../nios2-elf/bin/ld section .rodata [00000020 -> 00000047] overlaps section .exceptions [00000020 -> 000001c7]
5 U1 [! d! b) P" G$ N/cygdrive/d/MyProgram/altera/kits/nios2_60/bin/nios2-gnutools/H-i686-pc-cygwin/bin/../lib/gcc/nios2-elf/3.4.1/../../../../nios2-elf/bin/ld section .rwdata [00000048 -> 00000ab7] overlaps section .exceptions [00000020 -> 000001c7]
# H9 R: w9 A) n( k6 `; fregion onchip_memory_0 is full 这就是提示ram不够,根据程序适当改大一点后就能编译了。
/ C5 c" j$ j6 u# ?5 T, S( o# i# N
[ 本帖最后由 kenson 于 2008-12-12 22:04 编辑 ] |
|