Linux第75步_pinctrl子系统驱动和gpio子系统的常用函数

1、STM32MP1的pinctrl子系统驱动

pinctrl子系统源码目录为drivers/pinctrl,一个PIN最好只能被一个外设使用。

“stm32mp151.dtsi”中有一个“pin-controller节点标签”叫pinctrl

pinctrl: pin-controller@50002000 {

#address-cells = <1>;

/*定义子节点的reg和rangesaddres长度为32个位*/

#size-cells = <1>; 

/*定义子节点的reg和rangeslength长度为32个位*/

compatible = "st,stm32mp157-pinctrl";

/*compatible属性用于将设备和驱动绑定起来*/

ranges = <0 0x50002000 0xa400>; 

            /*子节点寄存器起始地址为0*/

/*父节点寄存器起始地址为0x50002000*/

/*寄存器最大偏移地址为0xa400*/

interrupt-parent = <&exti>;

st,syscfg = <&exti 0x60 0xff>;

hwlocks = <&hsem 0 1>;

pins-are-numbered;

gpioa: gpio@50002000 {  /*子节点gpio起始地址为0x50002000*/

gpio-controller;

#gpio-cells = <2>;

/*定义描述使用一个gpio口需要提供2个指定的参数*/

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x0 0x400>; 

/*reg属性的值:当前节点寄存器起始地址为0,长度为0x400*/

clocks = <&rcc GPIOA>;

st,bank-name = "GPIOA";

status = "disabled";

};

gpiob: gpio@50003000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

/*表明引用这个中断控制器需要2个cell*/

/*一个是使用哪个中断,另外一个是中断触发类型*/

reg = <0x1000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x1000,长度为0x400*/

clocks = <&rcc GPIOB>;

st,bank-name = "GPIOB";

status = "disabled";

};

gpioc: gpio@50004000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x2000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x2000,长度为0x400*/

clocks = <&rcc GPIOC>;

st,bank-name = "GPIOC";

status = "disabled";

};

gpiod: gpio@50005000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x3000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x3000,长度为0x400*/

clocks = <&rcc GPIOD>;

st,bank-name = "GPIOD";

status = "disabled";

};

gpioe: gpio@50006000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x4000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x4000,长度为0x400*/

clocks = <&rcc GPIOE>;

st,bank-name = "GPIOE";

status = "disabled";

};

gpiof: gpio@50007000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x5000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x5000,长度为0x400*/

clocks = <&rcc GPIOF>;

st,bank-name = "GPIOF";

status = "disabled";

};

gpiog: gpio@50008000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x6000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x6000,长度为0x400*/

clocks = <&rcc GPIOG>;

st,bank-name = "GPIOG";

status = "disabled";

};

gpioh: gpio@50009000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x7000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x7000,长度为0x400*/

clocks = <&rcc GPIOH>;

st,bank-name = "GPIOH";

status = "disabled";

};

gpioi: gpio@5000a000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x8000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x8000,长度为0x400*/

clocks = <&rcc GPIOI>;

st,bank-name = "GPIOI";

status = "disabled";

};

gpioj: gpio@5000b000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0x9000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0x9000,长度为0x400*/

clocks = <&rcc GPIOJ>;

st,bank-name = "GPIOJ";

status = "disabled";

};

gpiok: gpio@5000c000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0xa000 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0xa000,长度为0x400*/

clocks = <&rcc GPIOK>;

st,bank-name = "GPIOK";

status = "disabled";

};

};

pinctrl_z: pin-controller-z@54004000 {

#address-cells = <1>;

#size-cells = <1>;

compatible = "st,stm32mp157-z-pinctrl";

ranges = <0 0x54004000 0x400>;

            /*子节点寄存器起始地址为0*/

/*父节点寄存器起始地址为0x50004000*/

/*寄存器最大偏移地址为0x400*/

pins-are-numbered;

interrupt-parent = <&exti>;

st,syscfg = <&exti 0x60 0xff>;

hwlocks = <&hsem 0 1>;

gpioz: gpio@54004000 {

gpio-controller;

#gpio-cells = <2>;

interrupt-controller;

#interrupt-cells = <2>;

reg = <0 0x400>;

/*reg属性的值:当前节点寄存器起始地址为0,长度为0x400*/

clocks = <&scmi0_clk CK_SCMI0_GPIOZ>;

st,bank-name = "GPIOZ";

st,bank-ioport = <11>;

status = "disabled";

};

};

stm32mp15-pinctrl.dtsi中有一个pinctrl节点

&pinctrl {                     /*&pinctrl为节点名称*/

adc1_in6_pins_a: adc1-in6 {  /*adc1-in6为设备名*/

pins {

pinmux = <STM32_PINMUX('F', 12, ANALOG)>;

            /*GPIOF12用做AD输入口*/

};

};

m_can1_pins_a: m-can1-0 {

pins1 {

pinmux = <STM32_PINMUX('H', 13, AF9)>; /* GPIOH13用作CAN1_TX */

slew-rate = <1>;

drive-push-pull;/*推挽输出*/

bias-disable;/*禁止使用内部偏置电压*/

};

pins2 {

pinmux = <STM32_PINMUX('I', 9, AF9)>; /*GPIOI9用作CAN1_RX */

bias-disable;/*禁止使用内部偏置电压*/

};

};

uart4_pins_a: uart4-0 {

pins1 {

pinmux = <STM32_PINMUX('G', 11, AF6)>; /*GPIOG11用作UART4_TX */

bias-disable;/*禁止使用内部偏置电压*/

drive-push-pull;/*推挽输出*/

slew-rate = <0>;

};

pins2 {

pinmux = <STM32_PINMUX('B', 2, AF8)>; /*GPIOB2用作UART4_RX */

bias-disable;/*禁止使用内部偏置电压*/

};

};

uart4_pins_b: uart4-1 {

pins1 {

pinmux = <STM32_PINMUX('D', 1, AF8)>; /* GPIOD1用作UART4_TX */

bias-disable;  /*禁止使用内部偏置电压*/

drive-push-pull; /*推挽输出*/

slew-rate = <0>;

};

pins2 {

pinmux = <STM32_PINMUX('B', 2, AF8)>; /* GPIOB2用作UART4_RX */

bias-disable;/*禁止使用内部偏置电压*/

};

};

pwm1_pins_a: pwm1-0 {

pins {

pinmux = <STM32_PINMUX('E', 9, AF1)>, /* GPIOE9用作TIM1_CH1 */

 <STM32_PINMUX('E', 11, AF1)>, /*GPIOE11用作TIM1_CH2 */

 <STM32_PINMUX('E', 14, AF1)>; /* GPIOE14用作TIM1_CH4 */

bias-pull-down;/*内部下拉*/

drive-push-pull;/*推挽输出*/

slew-rate = <0>;

};

};

};

2、gpio子系统提供的常用API函数:

需要包含头文件#include <linux/gpio.h>

1)、申请“gpio编号”

int gpio_request(unsigned gpio, const char *label)

gpio:要申请的“gpio编号”

Iabel:给这个gpio引脚设置个名字为label所指向的字符串

返回值:0,申请“gpio编号”成功;其他值,申请“gpio编号”失败;

注意:GPIOA有16个引脚,因此GA0的“gpio编号”为0,GA15的“gpio编号”为15;GPIOB有16个引脚,因此GB0的“gpio编号”为16,GB15的“gpio编号”为31;GPIOC有16个引脚,因此GC0的“gpio编号”为32,GC15的“gpio编号”为47;等等以此类推

2)、释放“gpio编号”

void gpio_free(unsigned gpio)

gpio:要释放的“gpio编号”

struct MyGpioLED_dev{

  dev_t devid; /*声明32位变量devid用来给保存设备号 */

  int major; /* 主设备号 */

  int minor; /* 次设备号 */

  struct cdev  cdev; /*字符设备结构变量cdev */

  struct class *class; /* 类 */

  struct device *device;/*设备*/

  struct device_node *nd;/* 设备节点 */

  int led_gpio; /* led所使用的GPIO编号 */

};

struct MyGpioLED_dev strMyGpioLED;

int ret;

strMyGpioLED.nd = of_find_node_by_path("/gpio_led");

//path="/gpio_led,使用“全路径的节点名“在“stm32mp157d-atk.dts“中查找节点“gpio_led”

//返回值:返回找到的节点,如果为NULL,表示查找失败。

if(strMyGpioLED.nd == NULL) {

    printk("gpio_led node not find!\r\n");

    return -EINVAL;

}

strMyGpioLED.led_gpio = of_get_named_gpio(strMyGpioLED.nd, "led-gpio", 0);

  //在gpio_led节点中,led-gpio = <&gpioi 0 GPIO_ACTIVE_LOW>

  //np=strMyGpioLED.nd,指定的“设备节点”

  //propname="led-gpio",给定要读取的属性名字

  //Index=0,给定的GPIO索引为0

  //返回值:正值,获取到的GPIO编号;负值,失败。

if(strMyGpioLED.led_gpio < 0) {

    printk("can't get led-gpio");

    return -EINVAL;

  }

printk("led-gpio num = %d\r\n", strMyGpioLED.led_gpio);

  //打印结果为:“led-gpio num = 128“

  //因为GPIO编号是从0开始的,GPIOI端口的序号是8,每个端口有16个IO口,因此GPIOI0的编号为8*16=12

ret = gpio_request(strMyGpioLED.led_gpio, "LED-GPIO");

  //gpio=strMyGpioLED.led_gpio,指定要申请的“gpio编号”

  //Iabel="LED-GPIO",给这个gpio引脚设置个名字为"LED-GPIO"

  //返回值:0,申请“gpio编号”成功;其他值,申请“gpio编号”失败;

if (ret) {

    printk(KERN_ERR "strMyGpioLED: Failed to request led-gpio\n");

    return ret;

  }

gpio_free(strMyGpioLED.led_gpio);//释放“gpio编号”

3)、设置“某个GPIO为输入口”

int gpio_direction_input(unsigned gpio)

gpio:要设置为输入的“gpio编号”;

返回值:0,设置“某个GPIO为输入口”成功;负值,设置“某个GPIO为输入口”失败。

4)、设置“某个GPIO为输出口”

int gpio_direction_output(unsigned gpio, int value)

gpio:要设置为输出的“gpio编号”;

Value:GPIO 默认输出值;
返回值:0,设置“某个GPIO为输出口”成功;负值,设置“某个GPIO为输出口”失败。

5)、读取某个gpio口的值

#define gpio_get_value  __gpio_get_value

int __gpio_get_value(unsigned gpio)

gpio:要获取的“gpio编号”;

返回值:非负值,返回“gpio口的值”;负值,获取“gpio口的值”失败。

6)、设置gpio口的值为value

#define gpio_set_value  __gpio_set_value

void __gpio_set_value(unsigned gpio, int value)

gpio:要设置的“gpio编号”;

Value:要设置的值;

举例:

struct MyGpioLED_dev{

  dev_t devid; /*声明32位变量devid用来给保存设备号 */

  int major; /* 主设备号 */

  int minor; /* 次设备号 */

  struct cdev  cdev; /*字符设备结构变量cdev */

  struct class *class; /* 类 */

  struct device *device;/*设备*/

  struct device_node *nd;/* 设备节点 */

  int led_gpio; /* led所使用的GPIO编号 */

};

struct MyGpioLED_dev strMyGpioLED;

int ret;

strMyGpioLED.nd = of_find_node_by_path("/gpio_led");

//path="/gpio_led,使用“全路径的节点名“在“stm32mp157d-atk.dts“中查找节点“gpio_led”

//返回值:返回找到的节点,如果为NULL,表示查找失败。

if(strMyGpioLED.nd == NULL) {

    printk("gpio_led node not find!\r\n");

    return -EINVAL;

}

strMyGpioLED.led_gpio = of_get_named_gpio(strMyGpioLED.nd, "led-gpio", 0);

  //在gpio_led节点中,led-gpio = <&gpioi 0 GPIO_ACTIVE_LOW>

  //np=strMyGpioLED.nd,指定的“设备节点”

  //propname="led-gpio",给定要读取的属性名字

  //Index=0,给定的GPIO索引为0

  //返回值:正值,获取到的GPIO编号;负值,失败。

if(strMyGpioLED.led_gpio < 0) {

    printk("can't get led-gpio");

    return -EINVAL;

  }

printk("led-gpio num = %d\r\n", strMyGpioLED.led_gpio);

  //打印结果为:“led-gpio num = 128“

  //因为GPIO编号是从0开始的,GPIOI端口的序号是8,每个端口有16个IO口,因此GPIOI0的编号为8*16=12

gpio_set_value(strMyGpioLED->led_gpio, 0); /* 打开LED灯 */

3、与gpio相关的of函数

需要包含头文件#include <linux/of_gpio.h>

1)、根据给定的“设备节点”和“GPIO属性”,统计GPIO的数量

int of_gpio_named_count(struct device_node *np, const char *propname)

np:指定的“设备节点”。

propname:要统计的GPIO属性。

返回值:正值,统计到的GPIO数量;负值,失败。

2)、根据给定的“设备节点”,统计具有“gpios属性”的GPIO的数量

int of_gpio_count(struct device_node *np)

np:指定的“设备节点”。

返回值:正值,返回具有“gpios属性”的GPIO的数量;负值,失败。

3)、根据给定的“设备节点”,属性名和GPIO索引,读取GPIO编号

int of_get_named_gpio(struct device_node *np, const char *propname, int index)

np:指定的“设备节点”。

propname:包含要获取GPIO信息的属性名;

Index:GPIO索引,因为一个属性里面可能包含多个GPIO,此参数指定要获取哪个GPIO的编号,如果只有一个GPIO信息的话此参数为0;

返回值:正值,获取到的GPIO编号;负值,失败。

struct MyGpioLED_dev{

  dev_t devid; /*声明32位变量devid用来给保存设备号 */

  int major; /* 主设备号 */

  int minor; /* 次设备号 */

  struct cdev  cdev; /*字符设备结构变量cdev */

  struct class *class; /* 类 */

  struct device *device;/*设备*/

  struct device_node *nd;/* 设备节点 */

  int led_gpio; /* led所使用的GPIO编号 */

};

struct MyGpioLED_dev strMyGpioLED;

int ret;

strMyGpioLED.nd = of_find_node_by_path("/gpio_led");

//path="/gpio_led,使用“全路径的节点名“在“stm32mp157d-atk.dts“中查找节点“gpio_led”

//返回值:返回找到的节点,如果为NULL,表示查找失败。

if(strMyGpioLED.nd == NULL) {

    printk("gpio_led node not find!\r\n");

    return -EINVAL;

}

strMyGpioLED.led_gpio = of_get_named_gpio(strMyGpioLED.nd, "led-gpio", 0);

  //在gpio_led节点中,led-gpio = <&gpioi 0 GPIO_ACTIVE_LOW>

  //np=strMyGpioLED.nd,指定的“设备节点”

  //propname="led-gpio",给定要读取的属性名字

  //Index=0,给定的GPIO索引为0

  //返回值:正值,获取到的GPIO编号;负值,失败。

if(strMyGpioLED.led_gpio < 0) {

    printk("can't get led-gpio");

    return -EINVAL;

  }

printk("led-gpio num = %d\r\n", strMyGpioLED.led_gpio);

  //打印结果为:“led-gpio num = 128“

  //因为GPIO编号是从0开始的,GPIOI端口的序号是8,每个端口有16个IO口,因此GPIOI0的编号为8*16=128

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【24春招/Java】Java的市场情况介绍及Spring Boot基础

Java的市场情况 需求减少 人员增加 面试难度增加 1、Java高级开发&#xff0c;100份简历&#xff0c;筛选了20份&#xff0c;邀约20个人面试 面试机会&#xff1a;录取人数20:1 充分准备通过面试的前提 不要裸面&#xff01;&#xff01;&#xff01; 背葵花宝典&#xff08;…

23.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-实现配置工具数据结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;22.加载配置文件…

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器&#xff0c;想搭建一个站库分离的wordpress为主的网站&#xff0c;采用d…

PID控制器组(完整SCL代码)

PID控制器组不是什么新概念,是在PID控制器的基础上,利用面向对象的思想对对象进行封装 批量实例化。 1、增量式PID https://rxxw-control.blog.csdn.net/article/details/124363197https://rxxw-control.blog.csdn.net/article/details/1243631972、完全增量式PID https:/…

Vue 3:引领前端开发的未来

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

自制STLink-V2.1

STLink-V2.1需要使用的芯片是STM32F103CBT6 原理图如下&#xff1a; PCB如下&#xff1a; 将板子焊接好后下载&#xff1a;STM32 DebugMass storageVCP V2.J40.M27的固件后&#xff0c;再使用ST官方ST-LinkUpgrade工具对我们自制的STLink-V2.1进行升级。升级完成后&#xff0c…

数据结构---复杂度(2)

1.斐波那契数列的时间复杂度问题 每一行分别是2^0---2^1---2^2-----2^3-------------------------------------------2^(n-2) 利用错位相减法&#xff0c;可以得到结果是&#xff0c;2^(n-1)-1,其实还是要减去右下角的灰色部分&#xff0c;我们可以拿简单的数字进行举例子&…

Redis 的基本全局命令

前言 Redis 常用的有 5 种数据结构&#xff0c;字符串&#xff0c;列表&#xff0c;哈希表&#xff0c;集合&#xff0c;有序集合&#xff0c;每一种数据结构都有自己独特的命令&#xff0c;但也有些通用的全局命令&#xff0c;本文所提到的是最基本的命令&#xff0c;Redis 的…

前端存储方案

如今主流的存储方案&#xff1a; cookieweb storageindexDB 这三个浏览器兼容性最高的三种前端储存方案 1、cookie 它的出现是为了解决 HTTP 协议无状态特性的问题&#xff0c;简单来说就是想要得到上次http请求的数据是办不到的&#xff0c;只有再次从新请求。我们见得最多…

2024年零基础自学网络安全/Web安全,看这一篇就够了

作为一个安全从业人员&#xff0c;我自知web安全的概念太过于宽泛&#xff0c;我本人了解的也并不够精深&#xff0c;还需要继续学习。 但又不想新入行的人走弯路&#xff0c;所以今天随手写写关于web安全的内容&#xff0c;希望对初次遇到web安全问题的同学提供帮助&#xff…

设计模式:软件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTML:注释的 5 种场景和 5 点注意事项

你好&#xff0c;我是云桃桃。 HTML 代码注释是用来在 HTML 源代码中添加一些说明性文字&#xff0c;而不会显示在页面中的内容。它们不会在浏览器中显示或渲染。 现在我们一起来看看它的语法&#xff0c;用途和注意事项吧。 注释语法 HTML 注释的基本语法格式是: <!--…

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求…

绝赞春招拯救计划 -- 数据结构篇

哈希表 来吧&#xff01;一文彻底搞定哈希表&#xff01; - 知乎 (zhihu.com) 百科解释&#xff1a; “散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&…

免费的 AI 视频生成工具 Moonvalley 厉害了!Moonvalley 怎么用(保姆级教程)

一、Moonvalley 介绍 Moonvalley&#xff0c;号称地表最强的 AI 视频生成工具&#xff0c;到底有多厉害&#xff1f;今天一起来看一下~ 这是 Moonvalley 官网的介绍&#xff1a; Moonvalley 是一个开创性的新型文本到视频的生成式 AI 模型。用简单的文本即可创建出惊人的电影和…

蓝桥杯练习系统(算法训练)ALGO-976 P0804字符串压缩

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个函数void strcompress(char *s)&#xff0c;输入一个字符串&#xff08;只包含小写字母和空格&#xff0c;且长度小于1000&am…

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 这篇论文是基于VideoCrafter的&#xff0c;而VideoCrafter是基于LVDM的 关于LVDM可以看https://blog.csdn.net/Are_you_ready/article/details/136615853 2023年12月6日发表在arxiv 这篇论文讨论…

【深度学习】线性回归

Linear Regression 一个例子线性回归机器学习中的表达评价函数好坏的度量&#xff1a;损失&#xff08;Loss&#xff09;损失函数&#xff08;Loss function&#xff09;哪个数据集的均方误差 (MSE) 高 如何找出最优b和w?寻找最优b和w如何降低损失 (Reducing Loss)梯度下降法梯…

绪论——算法设计原则【数据科学与工程算法基础】

一、题记 最近情绪不太稳定&#xff0c;些许烦躁&#xff0c;也就一直没践行前边说的“学习记录”的想法。现在开始做了&#xff0c;春华易逝&#xff0c;正当时&#xff0c;有想法就去做&#xff0c;踌躇懊悔是这个年纪最不该做的事。 二、前言 之前说了分块做这个系列&#x…

101. Go单测系列1---使用monkey打桩

本文将介绍如何在单元测试中使用monkey进行打桩。 monkey支持为任意函数及方法进行打桩。 monkey介绍 monkey是一个Go单元测试中十分常用的打桩工具&#xff0c;它在运行时通过汇编语言重写可执行文件&#xff0c;将目标函数或方法的实现跳转到桩实现&#xff0c;其原理类似…