1、一般gpio_request封装了mem_request(),起保护作用,最后要调用mem_free之类的。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述。 这种用法的保护作用前提是大家都遵守先申请再访问,有一个地方没遵守这个规则,这功能就失效了。好比进程互斥,必需大家在访问临界资源的时候都得先获取锁一样,其中一个没遵守约定,代码就废了。 2、__gpio_set_value和gpio_set_value的区别 一般带__这种操作的宏和函数是未保护的,对这中__操作的使用最好不用,除非你知道其中的原理。 你说的这种显然就是地址检测保护了。主要是防止错误地址引用。__gpio_set_vallue是没有地址范围检测的,如果引用非法地址,有可能内核down掉。 其原型为 int gpio_request(unsigned gpio, const char *label)先说说其参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。 其具体实现如下: int gpio_request(unsigned gpio, const char *label) spin_lock_irqsave(&gpio_lock, flags);//屏蔽中断 if (!gpio_is_valid(gpio))//判断是否有效,也就是参数的取值范围判断 已经被申请了,而这个变量就是下面会看到的desc->flags。 if (!try_module_get(chip->owner)) /* NOTE: gpio_request() can be called in early boot, if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {这里测试并设置flags的第FLAG_REQUESTED位,如果没有被申请就返回该位的原值0,分析到这儿, 也差不多满足了我的个人要求。 if (chip->request) { if (status < 0) { done: |
gpio_request的使用
最新推荐文章于 2024-08-23 15:10:24 发布