您的位置:首页 > 其它

keil 下模拟u-boot的cmd功能

2014-01-06 22:07 344 查看
主要实现CMD命令专门分布在一个段内

代码如下:

typedef struct __init_cmd {
char        *name;      /* Command Name         */
void     (*cmd)(void);
}init_cmd_t;
#define Struct_Section  __attribute__ ((used,section("INIT_CMD")))
#define INIT_CMD(name,cmd)  const init_cmd_t    __init_cmd_##name     Struct_Section = {#name,  cmd }

INIT_CMD(test1,Test_parm);
INIT_CMD(test2,Test_parm2);
INIT_CMD(test3,Test_parm2);
extern unsigned char Load$$INIT_SECTION$$Base[];
extern unsigned char Load$$INIT_SECTION$$Length[];

void u_printf(char *fmt,...);

void Init_all(unsigned long addr,unsigned long len)
{
init_cmd_t* pCmd;
unsigned long i;

for(i=0;i<len;)
{
pCmd = (init_cmd_t*)(addr+i);
u_printf("\nadd:0x%x\n",(unsigned long)(pCmd));
pCmd->cmd();
u_printf("name:%s\n",pCmd->name);
i+=sizeof(init_cmd_t);
}

}

void Test_parm(void)
{
u_printf("this is Test_parm!\n");
}

void Test_parm2(void)
{
u_printf("this is Test_parm2!\n");
}

int main(void)
{
int i,RX_status;
unsigned long add = (unsigned long)Load$$INIT_SECTION$$Base;
unsigned long len = (unsigned long)Load$$INIT_SECTION$$Length;

u_printf("add:0x%x  ---len:0x%x\n",add,len);

Init_all(add,len);

u_printf("\ninitover\n");
}


sct文件如下:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00040000  {    ; load region size_region
ER_IROM1 0x08000000 0x00040000  {  ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}

INIT_SECTION +0
{
*(INIT_CMD)
}

RW_IRAM1 0x20000000 0x0000C000  {  ; RW data
.ANY (+RW +ZI)
}
}


运行效果和map文件



map文件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: