c - 在用户代码中重用引导加载程序中包含的库
问题描述
我目前正在为带有 WizNet W5500 以太网控制器的 STM32F103C8T6 编写自定义以太网引导加载程序。我想将引导加载程序代码与用户代码尽可能分开。
问题是 WizNet 库约占所有可用 ROM 的 25%(仅 64k),所以我不想在引导加载程序和用户代码中都包含该库,而是仅将其包含在引导加载程序中并访问来自用户代码的库。
我目前对一种方法的想法是:
在引导加载程序中:
- 包括必要的 WizNet .h 文件(并执行以太网初始化和引导加载程序 foo)
- 使用结构/数组将所有已使用的库函数作为指针存储在 RAM 中的预定义位置
在用户代码中:
- 仍然包含 WizNet .h 文件,但使用存储的函数指针来“覆盖”默认库函数调用,或者告诉链接器不必链接它们以节省 ROM 空间。(这就是我不知道该怎么做的事情)
但是有一些我不知道如何解决的开放要求:
- 并非库的所有函数都在引导加载程序中调用,因此它们不会被链接。
所以在用户代码中,只有已经存在的函数应该通过函数指针调用。
如果在引导加载程序中不需要的用户代码中调用了库函数,则编译器/链接器必须将该函数放入用户代码中。 - 当库在用户代码中编译时,它应该尽可能在内部使用函数指针。
- 理想情况下,函数的名称应该保持不变,因此无论通过函数指针使用现有函数还是单独使用库,用户代码都保持兼容。
我对 C 链接的理解不足以完成这项工作。也许我的方法是完全错误的,有更好的方法,或者根本不可能。我希望有人能够在这里帮助我,并且我可以清楚地描述我的问题。
一些额外的限制/信息:
- 即使引导加载程序版本发生变化(它被重新编译并且库函数地址发生变化),用户代码也应该始终能够找到函数指针
- 我不想简单地包含所有库函数,因为那样也会浪费 ROM。
- 引导加载程序和用户代码都应该驻留在 ROM 中(例如,如果用户代码发生故障,则回退到引导加载程序)
- 引导加载程序可以更新用户代码,但不影响自己。
- (可选)我不想过多地修改原始的 WizNet 库。
解决方案
推荐阅读
- excel - Excel中的SHA512哈希
- php - 如何在 PHP 中创建可选的出生日期和性别字段
- algorithm - 如何解决涉及在给定时间窗口内访问的站点的固定顺序的优化问题
- javascript - 如何在 VueJs 中构造 router.js 文件?
- javascript - 模拟 fs.readFile - 单元测试
- linux - 如何使 linux 输出“异步”输出,如 htop 或 top
- deep-learning - 边界框创建器
- android - Android - 出现了奇怪的点
- python - Odoo 13:如何编写一个好的过滤器以便将数据发送到 odoo 网站页面?
- c# - 在固定的方形图片框中制作方形矩形,如网格