micropython mp对象和c类型的转换

在基于micropython进行底层c语言的扩展的时候,有时候会碰到需要把python的输入对象最终转换成c层面的数组。今天正好用到这个功能,测试成功,特此记录下来以备之后还会用到。

首先介绍一下我用的最多的两个转换:

一、把mp字符串转换成c的char *

如上面的代码,这个用起来就比较简单,arg就是对应python对应的函数参数,c中只需要调用mp_obj_str_get_str(arg)就可以返回char *类型的指针。

二、把mp整型转成成c类型的int类型

如上面这段代码所示,这里arg传递进来的是一个mp 整型的对象,是不能直接当做c层面的int类型操作的,所以需要进行一道转换。操作很简单,只需要调用mp_obj_get_int(arg);返回的就是c 中的int类型

下面我再介绍下相对复杂一点的,mp对象到c字符串的转换

还是先看一小段示例代码:

分析下这段代码,传递进来的同样是mp对象arg,定义了一个mp_buffer_info_t 类型的结构体,主要用他来存放我们转换后的数据。然后调用mp_get_buffer() ,该函数可以从bytearray类型的mp对象中提取出来mp_buffer_info_t 。这里有一点需要注意,就是传递进来的arg必须是bytestring/bytearray这两种类型。然后我们用pbuf指向bufinfo.buf同时加上类型转换(原来是void *类型的)。pbuf就相当于c的数组指针了,bufinfo.len就是数组的长度。

最后在还有一种把c层面的多个数据,通过元组类型返回到python层面:

这段代码大体思路讲一下,先定义一个mp对象的数组,大小为4。然后根据自己的需要往数组每个元素里面进行填充内容,每个元素可以放不同的mp类型,(python的tuple是可以把不同类型放一起的)最后我们返回一个新创建的tuple类型mp_obj_new_tuple(4,param);  当然也可以返回list类型的,就是把tuple替换成list。

您可能还喜欢...

1 条回复

  1. 善止说道:

    太强了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注