使用指向此函数的指针从 ARM 微 Controller 的 ROM 调用该函数?

标签 c pointers arm rom

我正在使用 cec1702(来自 microchip 的 cortex m4),该设备具有加密引擎,但只能通过 microchip 访问API。我不想使用官方 API,因为我尝试仅使用 gcc 进行最小设置,而对于 API 我需要下载整个IDE,而且我只需要几个函数..

在有关设备的 ROM 的文档中,我创建了 API 函数及其 symdef 表的列表,例如:

api_rng_mode                        = 0x00007425; 
api_rng_get_random_bytes            = 0x00007441; 

这两个函数的原型(prototype)如下所示:

void api_rng_mode(uint8_t tmode_pseudo);
uint32_t api_rng_get_random_bytes ( uint8_t *pbuff8,uint32_t num_bytes);

我的计划是仅通过定义指向它们的指针来使用这些函数,但我实际上这样做对吗? 对于那些 2 示例,我使用以下定义:

#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);

请注意,显式取消引用(使用 *)不是必需的,尽管可以这样做。

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

关于使用指向此函数的指针从 ARM 微 Controller 的 ROM 调用该函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52777302/

相关文章:

C编程-读取CSV文件

c - 从 bin 文件中读取单个 int 在 C 中给我一个段错误

c - 如何提高 CMWX1ZZABZ-091 RTC(实时时钟)的精度

c++ - 循环具有相似名称的对象

C - 可变参数宏,它扩展为对每个参数的一组宏调用

c - 多线程 - 使用线程执行将文件内容存储在 char **array 中的函数?

c - C中struct的双指针是什么意思

docker - "FTDI USB Serial Device converter now disconnected"docker 和 arm 的问题

ARM CPU 模式 SVC 指令

c - BCM2708 (RPi) Rasbpian FIQ 未触发