Linux ubuntu-18内核版本降级error: macro "access_ok" passed 3 arguments, but takes just 2

本文记录了解决在安装P4-SDE过程中因内核版本过高导致的问题,详细介绍了从发现错误到成功降级Linux内核版本的过程,包括修改软件源、安装指定版本内核、配置GRUB等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在安装P4-SDE过程中遇到部分问题,猜测是因为内核版本太高,特此记录
降级linux内核版本:

第一步./p4studio_build.py --use-profile p416_examples_profile安装依赖环境中的在加载bf-driver驱动的时候会出现错误:

出现的错误为 :

ar: `u' modifier ignored since `D' is the default (see `U')

error: macro "access_ok" passed 3 arguments, but takes just 2
'access_ok' undeclared (first use in this function)

于是查看了早期的内核版本与当前使用的内核版本的access_ok函数的区别,可见一斑;

 早期内核版本linux-image-3.10.87-10-generic

现在正在使用的内核版本linux-image-5.0.0-37-generic

发现问题所在,当前版本内核太高 

接下来就是准备对Linux的内核进行降级了 

vi ~/etc/apt/sources.list 

root模式下进入文件夹,对文件备份

deb http://security.ubuntu.com/ubuntu trusty-security main

在最后一行添加软件源地址

apt-get update

访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑

查询列表中可更新的内核:sudo apt-cache search linux-image

安装4.4版本内核: apt-get install linux-image-extra-4.4.0-109-generic

查看是否安装成功: dpkg -l |grep linux-image

进入grub文件:vim /etc/default/grub

修改文件如下:Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-109-generic

更新grub: update-grub


重启后重新查看内核版本,发现已经完成内核降级: uname -a

<think>嗯,用户遇到了Arduino中使用MCP23017时出现的pinMode宏报错问题,提示传递了3个参数但宏只接受2个。我需要帮他解决这个问题。首先,我应该回忆一下MCP23017的库函数以及Arduino的pinMode用法。 根据用户提供的引用内容,引用[3]提到MCP23017的地址引脚A0、A1、A2是用来设置设备地址的,这可能与库函数中的地址配置有关。而引用[2]指出Arduino的pinMode函数通常接受两个参数:引脚号和模式(INPUT、OUTPUT等)。用户的问题可能出在调用MCP23017的pinMode函数时传递了三个参数,而实际宏定义只接受两个。 接下来,我需要考虑常见的MCP23017库,比如Adafruit_MCP23017。这个库中的pinMode函数可能需要两个参数:引脚号和模式。如果用户错误地传递了三个参数,比如可能包含了地址或其他参数,就会导致宏报错。例如,正确的用法应该是mcp.pinMode(pin, mode),但用户可能写成了mcp.pinMode(address, pin, mode),从而引发错误。 另外,引用[4]和[5]提到宏参数数量不匹配的问题,比如定义时参数数量与调用时不一致。这种情况下,用户可能在某个头文件中宏定义有误,或者库版本不兼容。比如,某些旧版本的库可能要求不同的参数数量,而用户使用的代码可能是针对新版本编写的,或者相反。 可能的解决方案包括检查pinMode调用的参数数量,确保只有两个参数:引脚号和模式。此外,检查是否正确初始化了MCP23017对象,比如是否设置了正确的I2C地址。如果用户有多个MCP23017设备,地址设置是否正确,比如A0、A1、A2引脚是否接地或接VCC,引用[3]中提到的地址配置是否正确。 还需要确认使用的库是否正确安装,是否有版本冲突。有时候,不同的库可能有不同的函数签名,比如Adafruit的库和另一个第三方库可能在函数参数上有所不同。如果用户混合使用了不同的库,或者库文件被修改过,也可能导致此错误。 例如,正确的代码应该类似: #include <Adafruit_MCP23017.h> Adafruit_MCP23017 mcp; void setup() { mcp.begin(); mcp.pinMode(0, OUTPUT); // 正确,两个参数 } 如果用户写成mcp.pinMode(0, OUTPUT, something),就会出错。或者,如果用户错误地调用了其他函数,如digitalWrite,但参数传递错误。 此外,检查错误信息中的具体行号,找到代码中调用pinMode的位置,核实参数数量。如果有条件的话,用户应该提供代码片段,以便更准确地诊断问题。但根据现有信息,最可能的原因是参数数量不匹配,或者库版本问题。 总结可能的解决步骤:1. 检查pinMode调用是否有三个参数,改为两个。2. 确认使用的库正确,更新到最新版本。3. 检查MCP23017的地址设置是否正确,确保begin()调用正确。4. 查看库的文档,确认函数签名是否正确。</think>### 解决 Arduino 中 MCP23017 的 `pinMode` 宏参数错误 #### 问题分析 错误提示`passed 3 arguments but takes just 2`表明在调用`pinMode`宏时传递了3个参数,但实际定义仅接受2个参数。这可能由以下原因导致: 1. **宏定义冲突**:某些库可能定义了与`pinMode`同名的宏,导致参数数量不匹配[^4][^5]。 2. **函数调用错误**:MCP23017的`pinMode`函数本应接收引脚号(如`GPIOA0`)和模式(如`INPUT`/`OUTPUT`),但可能误传了额外参数(如地址配置)。 3. **库版本不兼容**:不同版本的MCP23017驱动库可能对函数签名有差异。 --- #### 解决方案 ##### 1. **检查并修正`pinMode`调用** MCP23017的`pinMode`标准用法为: ```cpp mcp.pinMode(pin, mode); // 正确:2个参数 ``` **错误示例**: ```cpp mcp.pinMode(address, pin, mode); // 错误:3个参数 ``` ##### 2. **确认MCP23017地址配置** MCP23017的I2C地址由硬件引脚A0、A1、A2决定(接地为0,接VCC为1)。例如: - 若A2=GND、A1=GND、A0=GND,地址为`0x20`[^3]。 - 初始化时需指定地址(若使用默认地址`0x20`,可省略): ```cpp Adafruit_MCP23017 mcp; mcp.begin(); // 默认地址0x20 ``` ##### 3. **检查库文件冲突** - **更新驱动库**:使用最新版`Adafruit-MCP23017`库(通过Arduino库管理器安装)。 - **避免宏覆盖**:检查代码中是否定义了与库冲突的宏(如`#define pinMode(...)`)。 ##### 4. **代码示例修正** ```cpp #include <Adafruit_MCP23017.h> Adafruit_MCP23017 mcp; void setup() { mcp.begin(); // 使用默认I2C地址0x20 mcp.pinMode(0, OUTPUT); // 设置GPIOA0为输出模式 mcp.digitalWrite(0, HIGH); // 输出高电平 } ``` --- #### 相关问题 1. **如何配置多个MCP23017设备?** 通过设置A0/A1/A2引脚电平分配不同地址(最多8个设备)。 2. **MCP23017中断功能如何实现?** 需连接INTA/INTB引脚至Arduino,并配置中断触发条件(如电平变化)。 3. **为何MCP23017的GPIO无法输出高电平?** 检查电源是否稳定(需3.3V或5V)、引脚模式是否设置为`OUTPUT`,以及`digitalWrite`是否调用正确[^3]。 --- 通过以上步骤,可解决`pinMode`宏参数错误问题,并确保MCP23017与Arduino的正常通信[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值