zoukankan      html  css  js  c++  java
  • keil 下模拟u-boot的cmd功能

    主要实现CMD命令专门分布在一个段内

    (转载请注明出处,Dreamxi嵌入式  http://www.cnblogs.com/Dreamxi/p/3507932.html )

    代码如下:

     1  typedef struct __init_cmd {  
     2         char        *name;      /* Command Name         */  
     3         void     (*cmd)(void);  
     4     }init_cmd_t;
     5 #define Struct_Section  __attribute__ ((used,section("INIT_CMD"))) 
     6 #define INIT_CMD(name,cmd)  const init_cmd_t    __init_cmd_##name     Struct_Section = {#name,  cmd } 
     7 
     8 
     9 INIT_CMD(test1,Test_parm);
    10 INIT_CMD(test2,Test_parm2);
    11 INIT_CMD(test3,Test_parm2);
    12 extern unsigned char Load$$INIT_SECTION$$Base[];
    13 extern unsigned char Load$$INIT_SECTION$$Length[];
    14 
    15 
    16 void Init_all(unsigned long addr,unsigned long len)
    17 {
    18     init_cmd_t* pCmd;
    19     unsigned long i;
    20     
    21     for(i=0;i<len;)
    22     {
    23         pCmd = (init_cmd_t*)(addr+i);
    24         u_printf("
    add:0x%x
    ",(unsigned long)(pCmd));
    25         pCmd->cmd();
    26         u_printf("name:%s
    ",pCmd->name);
    27         i+=sizeof(init_cmd_t);
    28     }
    29     
    30 }
    31 
    32 
    33 
    34 int main(void)
    35 {
    36     int i,RX_status;
    37     unsigned long add = (unsigned long)Load$$INIT_SECTION$$Base;
    38     unsigned long len = (unsigned long)Load$$INIT_SECTION$$Length;
    39 
    40 
    41     u_printf("add:0x%x  ---len:0x%x
    ",add,len);
    42     
    43     Init_all(add,len);
    44     
    45     u_printf("
    initover
    ");
    46 }
    1 void Test_parm(void)
    2 {
    3     u_printf("this is Test_parm!
    ");
    4 }
    5 
    6 void Test_parm2(void)
    7 {
    8     u_printf("this is Test_parm2!
    ");
    9 }

    sct文件如下:

     1 LR_IROM1 0x08000000 0x00040000  {    ; load region size_region
     2   ER_IROM1 0x08000000 0x00040000  {  ; load address = execution address
     3    *.o (RESET, +First)
     4    *(InRoot$$Sections)
     5    .ANY (+RO)
     6   }
     7   
     8   INIT_SECTION +0 
     9   {
    10     *(INIT_CMD)
    11   }
    12   
    13   RW_IRAM1 0x20000000 0x0000C000  {  ; RW data
    14    .ANY (+RW +ZI)
    15   }
    16 }

    最后生成的map文件

  • 相关阅读:
    IOS:APP网络状态的检测
    IOS:个人笔记|UI__使用Plist文件来进行数据的读取
    IntelliJ IDEA中项目import与open的区别
    打开电脑分屏
    微服务
    自增主键和UUID
    雪花算法
    使用navicat连接阿里云上mysql
    【vue】报错This dependency was not found
    跨域问题
  • 原文地址:https://www.cnblogs.com/Dreamxi/p/3507932.html
Copyright © 2011-2022 走看看