I.MX6ULL的官方 SDK 移植实验

news2024/10/5 21:20:03

系列文章目录

I.MX6ULL的官方 SDK 移植实验


I.MX6ULL的官方 SDK 移植实验

  • 系列文章目录
  • 一、前言
  • 二、I.MX6ULL 官方 SDK 包简介
  • 三、硬件原理图
  • 四、试验程序编写
    • 4.1 SDK 文件移植
    • 4.2 创建 cc.h 文件
    • 4.3 编写实验代码
  • 五、编译下载验证
    • 5.1编写 Makefile 和链接脚本
    • 5.2编译下载


一、前言

在I.MX6ULL模仿 STM32 驱动开发格式实验,我们参考 ST 官方给 STM32 编写的 stm32f10x.h 来自行编写 I.MX6ULL的寄存器定义文件。自己编写这些寄存器定义不仅费时费力,没有任何意义,而且很容易写错,**NXP 官方为 I.MX6ULL 编写了 SDK 包,在 SDK 包里面 NXP 已经编写好了寄存器定义文件,所以我们可以直接移植 SDK 包里面的文件来用。**虽然 NXP 是为 I.MX6ULL 编写的 SDK 包,但是 I.MX6UL 也是可以使用的!


二、I.MX6ULL 官方 SDK 包简介

NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32 的 STD 库或者
HAL 库,这个 SDK 包提供了 Windows 和 Linux 两种版本,分别针对主机系统是 Windows 和Linux。因为我们是在 Windows 下使用 Source Insight 来编写代码的,因此我们使用的是 Windows版本的。Windows 版本 SDK 里面的例程提供了 IAR 版本,肯定有人会问既然 NXP 提供了 IAR版本的 SDK,那我们为什么不用 IAR 来完成裸机试验,偏偏要用复杂的 GCC?因为我们要从简单的裸机开始掌握 Linux 下的 GCC 开发方法,包括 Ubuntu 操作系统的使用、Makefile 的编写、shell 等等。如果为了偷懒而使用 IAR 开发裸机的话,那么后续学习 Uboot 移植、Linux 移植和 Linux 驱动开发就会很难上手,因为开发环境都不熟悉!再者,不是所有的半导体厂商都会为 Cortex-A 架构的芯片编写裸机 SDK 包,我使用过那么多的 Cotex-A 系列芯片,也就发现了 NXP 给 I.MX6ULL 编写了裸机 SDK 包。而且去 NXP 官网看一下,会发现只有 I.MX6ULL这一款 Cotex-A 内核的芯片有裸机 SDK 包,NXP 的其它 Cotex-A 芯片都没有。
所以,使用 Cortex-A 内核芯片的时候不要想着有类似 STM32 库一样的东西,I.MX6ULL 是一个特例,基本所有的 Cortex-A 内核的芯片都不会提供裸机 SDK 包。因此在使用 STM32 的时候那些用起来很顺手的库文件,在 Cotex-A 芯片下基本都需要我们自行编写,比如.s 启动文件、寄存器定义等等。
nxp官网:www.nxp.com
在这里插入图片描述

下载图中的 WIN 版本 SDK,也就是“SDK2.2_iMX6ULL_WIN”
双击 SDK_2.2_MCIM6ULL_RFP_Win.exe 安装 SDK 包,安装的时候需要设置好安装位置,安装完成以后的 SDK 包如图所示:
在这里插入图片描述重点是需要 SDK 包里面与寄存器定义相关的文件,一共需要如下三个文件:
fsl_common.h:位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h。
fsl_iomuxc.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h。
MCIMX6Y2.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h。
整个 SDK 包我们就需要上面这三个文件,把这三个文件准备好,我们后面移植要用。


三、硬件原理图

I.MX6UALPHA 开发板上有一个 LED 灯,原理图如下图所示;
在这里插入图片描述
从图可以看出,LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03,当 GPIO1_IO03输出低电平(0)的时候发光二极管 LED0 就会导通点亮,当 GPIO1_IO03 输出高电平(1)的时候发光二极管 LED0 不会导通,因此 LED0 也就不会点亮。所以 LED0 的亮灭取决于 GPIO1_IO03的输出电平,输出 0 就亮,输出 1 就灭。


四、试验程序编写

4.1 SDK 文件移植

使用 VSCode 新建工程,将 fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这三个文件拷贝到工程中,这三个文件直接编译的话肯定会出错的!需要对其做删减,根据make报错的删掉对应不需要的函数以及裁剪

4.2 创建 cc.h 文件

新建一个名为 cc.h 的头文件,cc.h 里面存放一些 SDK 库文件需要使用到的数据类型,在cc.h 里面输入如下代码:

#ifndef __CC_H
#define __CC_H
/*
* 自定义一些数据类型供库文件使用
*/
#define __I   volatile
#define __O   volatile
#define __IO  volatile
#define ON 1
#define OFF 0
typedef signed char          int8_t;
typedef signed short         int int16_t;
typedef signed int           int32_t;
typedef unsigned char        uint8_t;
typedef unsigned short int   uint16_t;
typedef unsigned int         uint32_t;
typedef unsigned long long   uint64_t;
typedef signed char              s8; 
typedef signed short int         s16;
typedef signed int               s32;
typedef signed long long int     s64;
typedef unsigned char            u8;
typedef unsigned short int       u16;
typedef unsigned int             u32;
typedef unsigned long long int   u64;
#endif

在 cc.h 文件中我们定义了很多的数据类型,因为有些第三方库会用到这些变量类型。

4.3 编写实验代码

新建 start.S 和 main.c 这两个文件,start.S 文件的内容和I.MX6ULL模仿 STM32 驱动开发格式实验一样,直接复制过来就可以,创建完成以后工程目录如图所示:
在 main.c 中输入如下所示代码:

1 #include "fsl_common.h"
2 #include "fsl_iomuxc.h"
3 #include "MCIMX6Y2.h"
4 
5 /*
6 * @description : 使能 I.MX6U 所有外设时钟
7 * @param : 无
8 * @return : 无
9 */
10 void clk_enable(void)
11 {
12 CCM->CCGR0 = 0XFFFFFFFF;
13 CCM->CCGR1 = 0XFFFFFFFF;
14 
15 CCM->CCGR2 = 0XFFFFFFFF;
16 CCM->CCGR3 = 0XFFFFFFFF;
17 CCM->CCGR4 = 0XFFFFFFFF;
18 CCM->CCGR5 = 0XFFFFFFFF;
19 CCM->CCGR6 = 0XFFFFFFFF;
2021 }
22 
23 /*
24 * @description : 初始化 LED 对应的 GPIO
25 * @param : 无
26 * @return : 无
27 */
28 void led_init(void)
29 {
30 /* 1、初始化 IO 复用 */
31 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);
32 
33 /* 2、、配置 GPIO1_IO03 的 IO 属性 
34 *bit 16:0 HYS 关闭
35 *bit [15:14]: 00 默认下拉
36 *bit [13]: 0 kepper 功能
37 *bit [12]: 1 pull/keeper 使能
38 *bit [11]: 0 关闭开路输出
39 *bit [7:6]: 10 速度 100Mhz
40 *bit [5:3]: 110 R0/6 驱动能力
41 *bit [0]: 0 低转换率
42 */
43 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
44 
45 /* 3、初始化 GPIO,设置 GPIO1_IO03 设置为输出 */
46 GPIO1->GDIR |= (1 << 3); 
47 
48 /* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */
49 GPIO1->DR &= ~(1 << 3); 
50 }
51 
52 /*
53 * @description : 打开 LED 灯
54 * @param : 无
55 * @return : 无
56 */
57 void led_on(void)
58 {
59 /* 将 GPIO1_DR 的 bit3 清零 */
60 GPIO1->DR &= ~(1<<3);
61 }
62 
63 /*
64 * @description : 关闭 LED 灯
65 * @param : 无
66 * @return : 无
67 */
68 void led_off(void)
69 {
70 /* 将 GPIO1_DR 的 bit3 置 1 */
71 GPIO1->DR |= (1<<3);
72 }
73 
74 /*
75 * @description : 短时间延时函数
76 * @param - n : 要延时循环次数(空操作循环次数,模式延时)
77 * @return : 无
78 */
79 void delay_short(volatile unsigned int n)
80 {
81 while(n--){}
82 }
83 
84 /*
85 * @description : 延时函数,在 396Mhz 的主频下
86 * 延时时间大约为 1ms
87 * @param - n : 要延时的 ms 数
88 * @return : 无
89 */
90 void delay(volatile unsigned int n)
91 {
92 while(n--)
93 {
94 delay_short(0x7ff);
95 }
96 }
97 
98 /*
99 * @description : main 函数
100 * @param : 无
101 * @return : 无
102 */
103 int main(void)
104 {
105 clk_enable(); /* 使能所有的时钟 */
106 led_init(); /* 初始化 led */
107
108 while(1) /* 死循环 */
109 { 
110 led_off(); /* 关闭 LED */
111 delay(500); /* 延时 500ms */
112
113 led_on(); /* 打开 LED */
114 delay(500); /* 延时 500ms */
115 }
116
117 return 0;
118 }

和一样I.MX6ULL模仿 STM32 驱动开发格式实验,main.c 有 7 个函数,这 7 个函数的含义都一样,只是本代码我们使用的是移植好的 NXP 官方 SDK 里面的寄存器定义。


重点来看一下 led_init 函数中的第 31 行和第 43 行,这两行的内容如下:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);
IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0X10B0);

这 里 使 用 了 两 个 函 数 IOMUXC_SetPinMux 和 IOMUXC_SetPinConfig , 其 中 函 数IOMUXC_SetPinMux 是用来设置 IO 复 用 功 能 的 , 最 终 肯 定 设 置 的 是 寄 存 器
“IOMUXC_SW_MUX_CTL_PAD_XX”。函数 IOMUXC_SetPinConfig 设置的是 IO 的上下拉、速度等的,也就是寄存器“IOMUXC_SW_PAD_CTL_PAD_XX”,所以上面两个函数其实就是I.MX6ULL模仿 STM32 驱动开发格式实验中的:

IOMUX_SW_MUX->GPIO1_IO03 = 0X5;
IOMUX_SW_PAD->GPIO1_IO03 = 0X10B0;

函数 IOMUXC_SetPinMux 在文件 fsl_iomuxc.h 中定义,函数源码如下:

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,
 uint32_t muxMode,
 uint32_t inputRegister,
 uint32_t inputDaisy,
 uint32_t configRegister,
 uint32_t inputOnfield)
{
 *((volatile uint32_t *)muxRegister) =
 IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | 
IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);
 if (inputRegister)
 {
 *((volatile uint32_t *)inputRegister) = 
IOMUXC_SELECT_INPUT_DAISY(inputDaisy);
 }
}

函数 IOMUXC_SetPinMux 有 6 个参数,这 6 个参数的函数如下:
muxRegister : IO 的 复 用 寄 存 器 地 址 , 比 如 GPIO1_IO03 的 IO 复 用 寄 存 器
SW_MUX_CTL_PAD_GPIO1_IO03 的地址为 0X020E0068。
muxMode: IO 复用值,也就是 ALT0~ALT8,对应数字 0~8,比如要将 GPIO1_IO03 设置
为 GPIO 功能的话此参数就要设置为 5。
inputRegister:外设输入 IO 选择寄存器地址,有些 IO 在设置为其他的复用功能以后还需要设置 IO 输入寄存器,比如 GPIO1_IO03 要复用为 UART1_RX 的话还需要设置寄存器
UART1_RX_DATA_SELECT_INPUT,此寄存器地址为 0X020E0624。
inputDaisy:寄存器 inputRegister 的值,比如 GPIO1_IO03 要作为 UART1_RX 引脚的话此参数就是 1。
configRegister:未使用,函数 IOMUXC_SetPinConfig 会使用这个寄存器。
inputOnfield : IO 软件输入使能,以 GPIO1_IO03 为例就是寄存器
SW_MUX_CTL_PAD_GPIO1_IO03 的 SION 位(bit4)。如果需要使能 GPIO1_IO03 的软件输入功能的话此参数应该为 1,否则的话就为 0。
IOMUXC_SetPinMux 的函数体很简单,就是根据参数对寄存器 muxRegister 和 inputRegister进行赋值。在代码第 31 行使用此函数将 GPIO1_IO03 的复用功能设置为
GPIO,如下:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);

第一次看到上面代码的时候肯定会奇怪,为何只有两个参数?不是应该 6 个参数的吗?先看 IOMUXC_GPIO1_IO03_GPIO1_IO03 是个宏,在文件fsl_iomuxc.h 中有定义,NXP 的 SDK 库将一个 IO 的所有复用功能都定义了一个宏,比如GPIO1_IO03 就有如下 9 个宏定义:

IOMUXC_GPIO1_IO03_I2C1_SDA
IOMUXC_GPIO1_IO03_GPT1_COMPARE3 
IOMUXC_GPIO1_IO03_USB_OTG2_OC 
IOMUXC_GPIO1_IO03_USDHC1_CD_B 
IOMUXC_GPIO1_IO03_GPIO1_IO03 
IOMUXC_GPIO1_IO03_CCM_DI0_EXT_CLK 
IOMUXC_GPIO1_IO03_SRC_TESTER_ACK 
IOMUXC_GPIO1_IO03_UART1_RX 
IOMUXC_GPIO1_IO03_UART1_TX

上面 9 个宏定义分别对应着 GPIO1_IO03 的九种复用功能,比如复用为 GPIO 的宏定义就是:

#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 
0x0U, 0x020E02F4U

将这个宏带入到代码中的 31 行以后就是:

IOMUXC_SetPinMux (0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U, 0);

这样就与函数 IOMUXC_SetPinMux 的 6 个参数对应起来了,如果我们要将GPIO1_IO03 复用为 I2C1_SDA 的话就可以使用如下代码:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_I2C1_SDA, 0);

函数 IOMUXC_SetPinConfig,此函数同样在文件 fsl_iomuxc.h 中有定义,函数源码如下:

static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,
 uint32_t muxMode, uint32_t inputRegister,
 uint32_t inputDaisy,
 uint32_t configRegister,
 uint32_t configValue)
{
 if (configRegister)
 {
 *((volatile uint32_t *)configRegister) = configValue;
 }
}

函数 IOMUXC_SetPinConfig 有 6 个参数,其中前五个参数和函数 IOMUXC_SetPinMux 一样,但是此函数只使用了参数 configRegister 和 configValue,cofigRegister 参数是 IO 配置寄存器地址,比如 GPIO1_IO03 的 IO 配置寄存器为IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,其地址为 0X020E02F4,参数 configValue 就是要写入到寄存器 configRegister 的值。同理,代码中的 43 行展开以后就是:

IOMUXC_SetPinConfig(0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U, 0X10B0);

根据函数 IOMUXC_SetPinConfig 的源码可以知道,上面函数就是将寄存器 0x020E02F4 的值设置为 0X10B0。
以后就可以使用这两个函数来方便的配置 IO 的复用功能和 IO 配置。


五、编译下载验证

5.1编写 Makefile 和链接脚本

新建 Makefile 文件,Makefile 文件内容如下:

1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 NAME ?= ledc
3 
4 CC := $(CROSS_COMPILE)gcc
5 LD := $(CROSS_COMPILE)ld
6 OBJCOPY := $(CROSS_COMPILE)objcopy
7 OBJDUMP := $(CROSS_COMPILE)objdump
8 
9 OBJS := start.o main.o
10
11 $(NAME).bin:$(OBJS)
12 $(LD) -Timx6ul.lds -o $(NAME).elf $^
13 $(OBJCOPY) -O binary -S $(NAME).elf $@
14 $(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis
15
16 %.o:%.s
17 $(CC) -Wall -nostdlib -c -O2 -o $@ $<
18 
19 %.o:%.S
20 $(CC) -Wall -nostdlib -c -O2 -o $@ $<
21 
22 %.o:%.c
23 $(CC) -Wall -nostdlib -c -O2 -o $@ $<
24 
25 clean:
26 rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis

Makefile 文件是在I.MX6ULL模仿 STM32 驱动开发格式实验上修改的,只是使用到了变量。链接脚本 imx6ul.lds 的内容和I.MX6ULL模仿 STM32 驱动开发格式实验一样,可以直接复制该链接脚本文件使用。


5.2编译下载

使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 ledc.bin 文件下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload ledc.bin /dev/sdd //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板,如果代码运行正常的
话 LED0 就会以 500ms 的时间间隔亮灭


END

在这里插入图片描述

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

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

相关文章

运维 之 大文件分片刻录光盘

需求 因有些企业中涉及设备只能通过光盘介质方式拷贝文件&#xff0c;然而采购的单张光盘又不能确保存放下一些较大的文件&#xff0c;所以只能通过分片的方式逐个光盘存储。 Windows处理 1、安装压缩软件&#xff08;自行选择&#xff0c;这里使用WinRAR&#xff09;、Ultr…

在CentOS7上安装Oracle11

一、概述 Oracle有两种安装方式&#xff0c;桌面安装和静默安装。这里我采用桌面安装的方式。 不得不说&#xff0c;Oracle真的是我目前为止安装过的最麻烦的软件没有之一&#xff0c;比K8S还麻烦&#xff0c;Oracle&#xff0c;真有你的&#xff01;废话不多说&#xff0c;臭…

多级留言/评论的功能实现——Vue3前端篇

文章目录 思路分析封装组件父组件模板逻辑样式 子组件——二级留言模板逻辑样式 子组件——三级留言以上模板逻辑样式 留言组件的使用 写完论文了&#xff0c;来把评论的前端部分补一下。 前端的实现思路是自己摸索出来的&#xff0c;没找到可以符合自己需求的参考&#xff0c;…

C++的类和对象

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 万事万物皆可为对象&#xff0c;有其相应的属性和行为 一、封装 1.1 封装的意义 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制 在设计类的时候&#xff0c;属性…

需求分析部分图形工具

描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言 LangSmith是一个用于构建生产级 LLM 应用程序的平台&#xff0c;它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能&#xff0c;并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现&#xff0c;让开发者能…

论文阅读_管理模型的记忆_MemGPT

1 2 3 4 5 6 7 8 9英文名称: MemGPT: Towards LLMs as Operating Systems 中文名称: MemGPT&#xff1a;将LLMs打造成操作系统 链接: https://arxiv.org/abs/2310.08560 代码: https://github.com/cpacker/MemGPT 作者: Charles Packer, Sarah Wooders, Kevin Lin, Vivian Fang…

推荐10款优秀的组件库(一)

1.Ant Desgin UI 网址&#xff1a; https://ant-design-mobile.antgroup.com/zh Ant Design - 一套企业级 UI 设计语言和 React 组件库 "Ant Design Mobile"是一个在线的移动端Web体验平台&#xff0c;让你探索移动端Web的体验极限。 添加图片注释&#xff0c;不…

安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法让你事半功倍,快速发现应用安全隐患!

STRIDE威胁建模方法最早发表于2006年11月的《MSDN杂志》&#xff0c;作者是微软的工程师Shawn Hernan、Scott Lambert 、Tomasz Ostwald 和 Adam Shostack。那我们为什么要进行威胁建模&#xff1f; 如何使用数据流图对系统进行威胁建模&#xff1f;如何减轻威胁&#xff1f;接…

STM32F1之OV7725摄像头

目录 1. 摄像头简介 2. OV7725 摄像头简介 3. OV7725 引脚 4. OV7725 功能框架图 5. SCCB时序 5.1 SCCB 的起始、停止信号及数据有效性 5.2 SCCB 数据读写过程 1. 摄像头简介 在各类信息中&#xff0c;图像含有最丰富的信息&#xff0c;作为机…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比&#xff1f; "均衡可比"指的是在进行比较时&#xff0c;确保所比较的对象或情况具有相似的特征和条件&#xff0c;以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中&#xff0c;以确保比较结果的可信度和有效性。 在研究中&a…

HTML静态网页成品作业(HTML+CSS)——企业酒店官网网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

SpringCloud系列(26)--OpenFeign超时控制

前言&#xff1a;在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务&#xff0c;因为消费侧和服务侧是两个不同的微服务&#xff0c;这样可能会出现超时的现象&#xff0c;例如服务侧需要3秒处理任何才能返回结果&#xff0c;但消费侧可能2秒就断开连接了&#xff0c…

C++代码错误解决1(函数模板)

1、代码如下 //示例函数模板的使用 #include <iostream> #include <string> using namespace std; template <typename T>//函数模板 T max(T a,T b) {return a>b?a:b; } int main() {int a,b;cout<<"input two integers to a&b:"…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《计及温控厌氧发酵和阶梯碳交易的农村综合能源低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

自己手写一个单向链表【C风格】

//单链表 #include <iostream> #define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int ElemType;//元素的类型 typedef int Status;//返回状态typedef struct Node {ElemType data;//链表中保存的数据struct Node* next;//指向下…

【字典树(前缀树) 异或 离线查询】1707. 与数组中元素的最大异或值

本文涉及知识点 字典树&#xff08;前缀树&#xff09; 位运算 异或 离线查询 LeetCode1707. 与数组中元素的最大异或值 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries &#xff0c;其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组…

自定义一个复杂的React Table表格组件-06

前面基本了解了组件的基本用法&#xff0c;在本节会实现一个更高级的例子。另外需要注意本节代码是采用V15版本的createClass()、React.DOM和JSX实现的&#xff0c;有时间的同学可以改成类实现的方式。 html的世界中最复杂的UI控制就是表格了&#xff0c;原因是table它依赖本地…

Vitis HLS 学习笔记--控制驱动TLP-处理deadlock

目录 1. 简介 2. 代码解析 2.1 HLS kernel代码 2.2 查看接口报告 2.3 TestBench 2.4 Dataflow 报告 3. Takeaways 4. 总结 1. 简介 本文是对《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》实验内容的详细解释。 首先需要…