在mm32f3270为micropython创建Pin模块(2)

Introduction
上文书说,已经搭建了一个基本的能够在REPL中引用到的Pin模块。为了规避Hardfault的问题,暂时屏蔽了history的功能。勉强已经可以用起来了。

本文将要打通python对底层硬件的操作,进一步完成Pin模块。

本文可能会涉及到引脚表的设计问题

make_new()
 

static inline void mp_arg_check_num (
	size_t n_args,     /* 位置参数的总数量 */
	size_t n_kw,       /* 关键字参数的数量 */
	size_t n_args_min, /* 位置参数最少数量 */
	size_t n_args_max, /* 位置参数最大数量 */
	bool   takes_kw )  /* 是否包含关键字参数 */
{
    mp_arg_check_num_sig(n_args, n_kw, MP_OBJ_FUN_MAKE_SIG(n_args_min, n_args_max, takes_kw));
}

感觉在machine_pin_obj_make_new()里检查这个参数清单没啥功能性作用。如果参数无效,则直接报错?

后来在试用程序的过程发现挺有用的,当用户输入参数不正确时,会提示错误类型。

接下来用第一个make_new()的第一个传参找引脚。这个args[0]是个什么鬼?当传入pin_find时,是当它为一个对象的,可能是一个预先初始化好的引脚对象,也可能是一个数字
 

const machine_pin_obj_t *pin = pin_find(args[0]);

在machine_pin.c中实现pin_func()函数如下:

/* 格式化pin对象,传入参数无论是已经初始化好的pin对象,还是一个表示pin清单中的索引编号,通过本函数都返回一个期望的pin对象。 */
const machine_pin_obj_t *pin_find(mp_obj_t user_obj)
{
    //const machine_pin_obj_t *pin_obj;

    /* 如果传入参数本身就是一个Pin的实例,则直接送出这个pin。 */
    if ( mp_obj_is_type(user_obj, &machine_pin_type) )
    {
        return user_obj;
    }

    /* 如果传入参数是一个代表Pin清单的索引,则通过索引在Pin清单中找到这个pin,然后送出这个pin。 */
    if ( mp_obj_is_small_int(user_obj) )
    {
        uint8_t pin_idx = MP_OBJ_SMALL_INT_VALUE(user_obj);
        if ( pin_idx < machine_pin_board_pins_num)
        {
            return machine_pin_board_pins[pin_idx];
        }
    }

    /* 如果传入参数是一个字符串,则通过这个字符串在Pin清单中匹配引脚名字,然后送出找到的pin */
    const machine_pin_obj_t *named_pin_obj = pin_find_by_name(&machine_pin_board_pins_locals_dict, user_obj);
    if ( named_pin_obj )
    {
        return named_pin_obj;       
    }

    mp_raise_ValueError(MP_ERROR_TEXT("Pin doesn't exist"));
}

/* 通过字符串在引脚清单中匹配引脚 */
const machine_pin_obj_t *pin_find_by_name(const mp_obj_dict_t *name_dict, mp_obj_t name)
{
    mp_map_t *name_map = mp_obj_dict_get_map((mp_obj_t)name_dict);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值