c - 通过使用指向该函数的指针从 ARM 微控制器的 ROM 调用函数?
问题描述
我正在使用cec1702
(cortex m4
来自微芯片),这个设备有cryptographic engine
,但它只能通过微芯片的 API 访问。我不想使用官方API
,因为我试图只使用最小设置,gcc
并且API
我需要下载整个IDE
,我只需要几个功能..
在有关设备的文档中,ROM
我创建了这个API
函数列表及其 symdef 表,例如:
api_rng_mode = 0x00007425;
api_rng_get_random_bytes = 0x00007441;
这两个函数的原型如下所示:
void api_rng_mode(uint8_t tmode_pseudo);
uint32_t api_rng_get_random_bytes ( uint8_t *pbuff8,uint32_t num_bytes);
我的计划是仅通过定义指向它们的指针来使用这些函数,但我真的做对了吗?对于这两个示例,我使用以下定义:
#define api_rng_mode (void(*)(uint8_t))0x00007425
#define api_get_random_bytes (uint32_t(*(uint8_t,uint32_t))0x00007441
在代码中,我这样称呼它们:
(*api_rng_mode)(1);
(*api_get_random_bytes)(p, numberofbytes);
但到目前为止,它看起来不起作用......有什么想法吗?
编辑:谢谢大家的帮助:)它现在可以工作了,我学到了一些新东西:)之前的代码跳转到ROM的某个地方并卡在那里,但是通过在设置过程中重置RNG解决了它。
解决方案
该代码很可能是正确的,但是由于不尊重范围的宏的附加问题,它是边界不可读的。所以:
// alias the function types by just adding a `typedef`
typedef void api_rng_mode_function(uint8_t tmode_pseudo);
typedef uint32_t api_rng_get_random_bytes_function( uint8_t *pbuff8,uint32_t num_bytes);
这也使得模拟单元测试的函数变得更容易。然后,定义指向这些函数的指针:
// TODO: Add reference to documentation where these magic numbers came from!
api_rng_mode_function*const api_rng_mode = 0x00007425;
api_rng_get_random_bytes_function*const api_rng_get_random_bytes = 0x00007441;
然后,您可以使用普通函数语法调用相应的函数:
api_rng_mode(42);
uint8_t buffer[17];
uint32_t res = api_rng_get_random_bytes(buffer, sizeof buffer);
请注意*
,虽然可以这样做,但不需要显式取消引用 (with )。
现在唯一可能仍然导致问题的是“调用约定”,它是堆栈协议,即参数如何在堆栈上传递的方式。如果调用函数以错误的顺序推送它们,或者如果被调用函数需要寄存器中的一些参数,您可能需要告诉编译器甚至编写一些内联汇编。
推荐阅读
- google-apps-script - GoogleScript 没有标记想要的单元格
- javascript - Express 中间件类型不可分配
- javascript - ES6 JavaScript 将数组设置为普通控制台对象的属性
- javascript - 如何在我的主函数中使变量可访问
- gcc - cmake:在仅存在标头时在构建时使用共享库
- mysql - MySQL:获取每个唯一位置 5 英里内的客户总数
- excel - 为 VBA 中的每个 SQL 记录创建唯一 ID
- r - 如何增加面板边框和径向图之间的空间(ggplot2)
- csvhelper - CsvHelper 忽略复杂类型
- javascript - React Native Navigation v5 从底部选项卡触发抽屉