查看: 4638|回复: 9

[其他] 从flash中拷贝出的函数,用函数指针通过地址调用它失败

[复制链接]
  • TA的每日心情
    开心
    2020-8-5 09:59
  • 签到天数: 80 天

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
    发表于 2017-12-25 15:10:48 | 显示全部楼层 |阅读模式
    从flash中拷贝出的函数,用函数指针通过地址调用它失败,找不出原因,请大佬们帮帮忙。

    memcpy(ucFlashCode,0x1F000,0x9b0);//从 flash的 0x0001 f000处把函数拷贝到 RAM的0x1fff f000的地址处

    typedef uint16_t (*tFlashFct)(FLASH_SSD_CONFIG *flash_struct); // 这是我的函数指针,我的函数调用有一个返回值uint16_t,调用的时候需要一个结构体参数FLASH_SSD_CONFIG
    下面是我的调用:
    stConfig.usErrorCode = (*(tFlashFct)FLASH_DRIVER_INIT_ADDRESS)(&stConfig);//这里的FLASH_DRIVER_INIT_ADDRESS如果是flash的0x0001 f000函数就可以正常执行,如果是RAM的0x1fff f000函数就不能正常运行。

    最佳答案

    找个官方的例子给你参考下。 到这个链接下载代码: http://cache.nxp.com/downloads/e ... 1&pageNum=1 然后安装下,然后打开里面的kinties的CW代码,这个代码是做kinetis flash操作的,需要把flash的发起命令代 ...

    这个是KEA128的内存分布

    这个是KEA128的内存分布
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2017-12-25 15:20:51 | 显示全部楼层
    我没有猜错的话你想从0x1F000处copy数据对吧,0x1F000是个RAM/或者Flash的地址,memcpy(ucFlashCode,0x1F000,0x9b0);你想一下你这样子写对么?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    728

    主题

    6387

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25704
    最后登录
    2025-9-30
    发表于 2017-12-25 15:33:54 | 显示全部楼层
    找个官方的例子给你参考下。
    到这个链接下载代码:
    http://cache.nxp.com/downloads/e ... ;sr=1&pageNum=1
    然后安装下,然后打开里面的kinties的CW代码,这个代码是做kinetis flash操作的,需要把flash的发起命令代码从flash拷贝到RAM去运行,你打开一个kinetis的代码。
        g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)__ram_func , LAUNCH_CMD_SIZE ,(uint32_t)FlashCommandSequence);     
    参考下这个。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-25 15:46:55 | 显示全部楼层
    技术范儿 发表于 2017-12-25 15:20
    我没有猜错的话你想从0x1F000处copy数据对吧,0x1F000是个RAM/或者Flash的地址,memcpy(ucFlashCode,0x1F00 ...

    我觉得也不对,可是除了这个也没办法拷贝了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-25 16:19:13 | 显示全部楼层
    小恩GG 发表于 2017-12-25 15:33
    找个官方的例子给你参考下。
    到这个链接下载代码:
    http://cache.nxp.com/downloads/en/device-drivers/C9 ...

    OK,我看看,谢谢你
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-25 16:47:12 | 显示全部楼层
    小恩GG 发表于 2017-12-25 15:33
    找个官方的例子给你参考下。
    到这个链接下载代码:
    http://cache.nxp.com/downloads/en/device-drivers/C9 ...

    里边有一个 CopyToRam.c ,就是说,我要用这个函数?
    uint32_t SIZE_OPTIMIZATION RelocateFunction(uint32_t dest, uint32_t size, uint32_t src)去操作,
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-25 18:20:54 | 显示全部楼层
    小恩GG 发表于 2017-12-25 15:33
    找个官方的例子给你参考下。
    到这个链接下载代码:
    http://cache.nxp.com/downloads/en/device-drivers/C9 ...

    __ram_func这个是要拷贝到的地址吗?那我可以填ucFlashCode么?
    RelocateFunction函数的作用和memcopy一样,确实是把信息从flash拷贝到了一个地址内,但是函数没能跳转过去执行,您看我用的有问题吗:
    g_FlashLaunchCommand = (tFlashFct)RelocateFunction((uint32_t)ucFlashCode,0x114,(uint32_t)FLASH_Init_Api);

    g_FlashLaunchCommand 会返回一个地址,这里它返回了1fff f001。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    728

    主题

    6387

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25704
    最后登录
    2025-9-30
    发表于 2017-12-26 11:23:44 | 显示全部楼层
    ,忆昔颜 发表于 2017-12-25 16:47
    里边有一个 CopyToRam.c ,就是说,我要用这个函数?
    uint32_t SIZE_OPTIMIZATION RelocateFunction(uint ...

    关键就是这个函数把flash里面的数据拷贝到RAM的。
    __ram_func是一个数组,其实就是RAM里面的数组,未来要放flash数据的。
    你拷贝之后,对比下flash生成的数据和你RAM里面的数据是否一样。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    173

    帖子

    2

    中级会员

    Rank: 3Rank: 3

    积分
    498
    最后登录
    2020-9-3
     楼主| 发表于 2017-12-26 16:26:45 | 显示全部楼层
    小恩GG 发表于 2017-12-26 11:23
    关键就是这个函数把flash里面的数据拷贝到RAM的。
    __ram_func是一个数组,其实就是RAM里面的数组,未来要 ...

    拷贝完之后存放的数据是一样的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5650
    最后登录
    2021-12-22
    发表于 2017-12-26 16:53:58 | 显示全部楼层
    本帖最后由 okwh 于 2017-12-26 19:06 编辑

    除非已经熟悉或已经是高手中的高手,看这代码是不容易弄明白原为的, 要仔细跟踪检查汇编代码.....才好检查 代码地址、传入参数、传出参数或返回、其他数据  是否正确
    如果简单时,试试这个Relocating Code and Data Using the KDS GCC Linker File for Kinetis.pdf
    http://community.nxp.com/servle ... 20for%20Kinetis.pdf

    复杂的,可参考看看uboot如何relocate的 http://blog.csdn.net/skyflying2012/article/details/37660265

    http://blog.csdn.net/gjq_1988/article/details/22315913

    http://blog.csdn.net/gjq_1988/article/details/22316015

    http://blog.csdn.net/gjq_1988/article/details/22316065
    如果这些看不懂,还是不要这样做。
    -----------------------
    不过 干嘛一定要搬到RAM, 除个别特殊需要,效率增加不大的。你确信要做这开发操作系统才需要做的事情?
    估计你不过是建立个库,何必这么麻烦,封装库lib只使用头文件可调用就就可以了, 就象 emWin那样的东西 让用户编译时重链接 就可以了









    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-10-1 03:44 , Processed in 0.109134 second(s), 32 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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