12
返回列表 发新帖
楼主: ,忆昔颜

[已解决] 在KEA128中把函数放在固定的位置

[复制链接]

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2017-12-21 17:13:20 | 显示全部楼层
,忆昔颜 发表于 2017-12-21 16:25
有没有现成的例子程序可以参考一下,现在的目标就是我通过地址去调用它,而不是通过函数名字 ...

其实可以定义个函数,把函数的指针在指到你所放的flash地址去。
这个给你举个例子,是LPC ROM的。
typedef        struct _ROM {
   const unsigned p_usbd;
   const unsigned p_clib;
#if (PERIPHERAL == CAN)
   const CAND *pCAND;
#else
   const unsigned pCAND;
#endif /* (PERIPHERAL == CAN) */
   const unsigned p_pwrd;
   const unsigned p_dev1;
   const unsigned p_dev2;
   const unsigned p_dev3;
   const unsigned p_dev4;
}  ROM;

typedef        struct _CAND {
  void (*init_can)(uint32_t * can_cfg, uint8_t isr_ena);
  void (*isr)(void);
  void (*config_rxmsgobj)(CAN_MSG_OBJ * msg_obj);
  uint8_t (*can_receive)(CAN_MSG_OBJ * msg_obj);
  void (*can_transmit)(CAN_MSG_OBJ * msg_obj);
  void (*config_canopen)(CAN_CANOPENCFG * canopen_cfg);
  void (*canopen_handler)(void);
  void (*config_calb)(CAN_CALLBACKS * callback_cfg);
}CAND;

ROM **rom = (ROM **)0x1fff1ff8;

    (*rom)->pCAND->can_transmit(&msg_obj);
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2020-8-5 09:59
  • 签到天数: 80 天

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-21 17:29:59 | 显示全部楼层
    小恩GG 发表于 2017-12-21 17:13
    其实可以定义个函数,把函数的指针在指到你所放的flash地址去。
    这个给你举个例子,是LPC ROM的。
    typede ...

    这个0x1fff1ff8就是存放这些函数的地址吗
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-8-5 09:59
  • 签到天数: 80 天

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-21 17:37:45 | 显示全部楼层
    本帖最后由 ,忆昔颜 于 2017-12-21 17:39 编辑
    小恩GG 发表于 2017-12-21 17:13
    其实可以定义个函数,把函数的指针在指到你所放的flash地址去。
    这个给你举个例子,是LPC ROM的。
    typede ...

    我把我的flash函数都放在0X1FFFF000开始的地址,我是这么放进去的:
    __attribute__ ((section (".paraconfig"))) uint16_t FLASH_Init_Api(FLASH_SSD_CONFIG* flash_struct);
    __attribute__ ((section (".paraconfig"))) uint16_t FLASH_Erase_Api(FLASH_SSD_CONFIG* flash_struct);
    __attribute__ ((section (".paraconfig"))) uint16_t FLASH_Write_Api(FLASH_SSD_CONFIG* flash_struct);
    __attribute__ ((section (".paraconfig"))) uint16_t FLASH_Protect_Api(FLASH_SSD_CONFIG* flash_struct);
    __attribute__ ((section (".paraconfig"))) uint16_t FLASH_Read(uint32_t Address, uint8_t *pData, uint16_t sizeBytes);
    现在我想通过地址去让这些函数运行,这些函数在map中的大小是:
    *(.paraconfig)
    .paraconfig    0x1ffff000      0x99c ./Sources/flash1.o
                    0x1ffff000                FLASH_Init_Api
                    0x1ffff100                FLASH_Write_Api
                    0x1ffff5ec                FLASH_Erase_Api
                    0x1ffff79c                FLASH_Read
                    0x1ffff840                FLASH_Protect_Api
    *fill*         0x1ffff99c        0x4 00
    ,而这些函数是在RAM里是头尾相接的,一个函数尾后面紧跟着一个函数,这样的话,我改怎么去用地址去让他们分别执行呢?这个flash驱动将来是要封装成BIN的,封装成bIN之后就得用地址去访问他们了,这个实在不太会~~~·
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 16:13 , Processed in 0.087614 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表