首页 > 解决方案 > 通过使用指向该函数的指针从 ARM 微控制器的 ROM 调用函数?

问题描述

我正在使用cec1702cortex 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解决了它。

标签: cpointersarmrom

解决方案


该代码很可能是正确的,但是由于不尊重范围的宏的附加问题,它是边界不可读的。所以:

// 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 )。

现在唯一可能仍然导致问题的是“调用约定”,它是堆栈协议,即参数如何在堆栈上传递的方式。如果调用函数以错误的顺序推送它们,或者如果被调用函数需要寄存器中的一些参数,您可能需要告诉编译器甚至编写一些内联汇编。


推荐阅读