原创 设计的处理器可以跑gcc编译的程序了!!!!!!

2007-9-22 18:41 2677 5 4 分类: 汽车电子

.18可以跑200M(用的2000年出的RTL编译器,如果用现在的synopsys cadence的工具,可能频率还可以提升些),带tlb的。某指令集兼容,暂时缺少cache估计RTL要2个月后出来。


花了2个星期时间终于弄明白了gcc as ld 相关的东西,知道


main函数是怎么被调用的,入口是怎么设置的,然后自己写了 处理器的初始化汇编,初始化的堆栈指针,再跳转到main函数,程序就可以跑了。


 然后写了个makefile,makefile做了如下工作:


自动编译程序,链接,objdump文件,然后调用tcl把里面的汇编指令机器码提取出来,生成.hex文件,在modelsim仿真时,verilog文件中的 altera 存储器模型调用该.hex文件,同时还要生成一个 verilog $readmemh 能够识别的 .dat文件


然后运行modelsim的,就可以看见结果了。 只是写来个 memcpy函数 和1+2..+n的函数,然后main函数调用这2个函数,把求和结果输出到memoy的特定位置,虽然简单,但是也证明流程是没有问题的了,


现在的问题是这个处理器在仿真的时候只是挂了个4096字节的存储器,然后写要扣除自己定义的1024字节的堆栈,可以编译的程序空间就只有 3K字节了,并且堆栈大小和运行的程序有关,还要写个可以分析elf文件的程序,推算堆栈大小,然后二次编译,让4096字节能够存放更多的程序内容。


贴个测试程序:


/*
extern void *memcpy(void *__to, __const__ void *__from, unsigned int __n);
*/
#include "sb_lib/lib.h"


int sum (int a[10]) {
 int i,d;
 d=0;
 for (i=0;i<10;i++)
    d="d"+a;
    return (d*10);
}


int main() {
 int j,i[10]={1,2,3,4,5,6,7,8,9,0};
 j=sizeof(int);
 * (int *)0x20000000=sum(i)+j;
 return (* (int *)0x20000000);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条