网站建设推广实训总结/大连百度网站排名优化
最近在使用NXP的提供的MCUXPresso IDE,除了Eclipse固有的优点外,我觉得它最大的优点就是在链接脚本的生成上,提供了非常直观的GUI配置界面。但这个IDE仅仅支持NXP相关的产品,而且调试的性能在某些情况下并不理想。而我们用得比较多的IDE是Keil和IAR,这两个IDE都有自己生成链接脚本的格式,本篇文章就来介绍一下与IAR的链接脚本生成相关的.icf
(IAR Configuration File
)后缀的IAR配置文件。
文章目录
- 1 内存映射
- 2 ICF语法分析
- 2.1 工程的ICF文件
- 2.2 define [exported] symbol和isdefinedsymbol
- 2.3 define memory、define region、区域表达式和define block
- 2.4 initialize by copy和do not initialize
- 2.5 place at、keep和place in
本来打算把ICF文件中的每一个指令的格式都详细地介绍一遍,但发现里面的指令太多了,而且很多都用不到。完整的指令请参考:<EWARM_DevelopmentGuide.ENU.pdf>中的The linker configuration file
章节。
所以本篇文章就以I.MX RT1176的IAR工程中的ICF
文件为例进行分析,然后详细理解一下每个用到的指令格式。对于本节的ICF例子,除了RT1176内部的几个RAM外,还接了NOR Flash和SDRAM。所以如果懂了这个ICF配置文件,对于其它MCU的配置文件来说也不会有太大的问题。
1 内存映射
首先来看一下整个工程的内存映射表格:
类型 | 名称 | 起始地址 | 大小 |
---|---|---|---|
Flash | NOR Flash | 0x30000000 | 0x1000000 |
RAM | SDRAM | 0x80000000 | 0x3000000 |
RAM | NCACHE_REGION | 0x83000000 | 0x1000000 |
RAM | SRAM_DTC_cm7 | 0x20000000 | 0x40000 |
RAM | SRAM_ITC_cm7 | 0x0 | 0x40000 |
RAM | SRAM_OC1 | 0x20240000 | 0x80000 |
RAM | SRAM_OC2 | 0x202c0000 | 0x80000 |
RAM | SRAM_OC_ECC1 | 0x20340000 | 0x10000 |
RAM | SRAM_OC_ECC2 | 0x20350000 | 0x10000 |
对于我们的工程来说,有以下几个内存:
- 两个256KB的紧耦合内存
DTCM
和ITCM
- 两个带ECC的片内RAM:
OC1
和OC2
。 - 在映射的起始地址为
0x30000000
的FlexSPI1接口上接了一个16MB的NOR Flash - 在映射的起始地址为
0x80000000
的FlexSPI2接口上接了一个64MB的SDRAM。其中,前48MB用于可缓存的区域,后16MB(NCACHE_REGION
)用于不可缓存区域,通常直接与硬件进行交互的buffer需要设置为不可缓存。
2 ICF语法分析
2.1 工程的ICF文件
针对上面的内存映射,官方的SDK中提供的ICF文件如下:
define symbol __ram_vector_table_size__ = isdefinedsymbol(__ram_vector_table__) ? 0x00000400 : 0;
define symbol __ram_vector_table_offset__ = isdefinedsymbol(__ram_vector_table__) ? 0x000003FF : 0;define symbol m_interrupts_start = 0x30002000;
define symbol m_interrupts_end = 0x300023FF;define symbol m_text_start = 0x30002400;
if (isdefinedsymbol(__use_flash64MB__)) {define symbol m_text_end = 0x33FFFFFF;
} else{define symbol m_text_end = 0x30FFFFFF;
}define symbol m_interrupts_ram_start = 0x20000000;
define symbol m_interrupts_ram_end = 0x20000000 + __ram_vector_table_offset__;define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__;
define symbol m_data_end = 0x2003FFFF;define symbol m_data2_start = 0x202C0000;
define symbol m_data2_end = 0x2033FFFF;define symbol m_data3_start = 0x80000000;
define symbol m_data3_end = 0x82FFFFFF;define symbol m_ncache_start = 0x83000000;
define symbol m_ncache_end = 0x83FFFFFF;define exported symbol __NCACHE_REGION_START = m_ncache_start;
define exported symbol __NCACHE_REGION_SIZE = m_ncache_end - m_ncache_start + 1;define symbol m_qacode_start = 0x00000000;
define symbol m_qacode_end = 0x0003FFFF;define exported symbol m_boot_hdr_conf_start = 0x30000400;
define symbol m_boot_hdr_ivt_start = 0x30001000;
define symbol m_boot_hdr_boot_data_start = 0x30001020;
define symbol m_boot_hdr_dcd_data_start = 0x30001030;
define symbol m_boot_hdr_xmcd_data_start = 0x30001040;/* Sizes */
if (isdefinedsymbol(__stack_size__)) {define symbol __size_cstack__ = __stack_size__;
} else {define symbol __size_cstack__ = 0x0400;
}if (isdefinedsymbol(__heap_size__)) {define symbol __size_heap__ = __heap_size__;
} else {define symbol __size_heap__ = 0x0400;
}define exported symbol __VECTOR_TABLE = m_interrupts_start;
define exported symbol __VECTOR_RAM = isdefinedsymbol(__ram_vector_table__) ? m_interrupts_ram_start : m_interrupts_start;
define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__;define memory mem with size = 4G;
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]| mem:[from m_text_start to m_text_end];
define region QACODE_region = mem:[from m_qacode_start to m_qacode_end];
define region DATA_region = mem:[from m_data_start to m_data_end];
define region DATA2_region = mem:[from m_data2_start to m_data2_end];
define region DATA3_region = mem:[from m_data3_start to m_data3_end-__size_cstack__];
define region CSTACK_region = mem:[from m_data3_end-__size_cstack__+1 to m_data3_end];
define region NCACHE_region = mem:[from m_ncache_start to m_ncache_end];define block CSTACK with alignment = 8, size = __size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
define block RW { first readwrite, section m_usb_dma_init_data };
define block ZI with alignment = 32 { first zi, section m_usb_dma_noninit_data };
define block NCACHE_VAR { section NonCacheable , section NonCacheable.init };
define block QACCESS_CODE { section CodeQuickAccess };
define block QACCESS_DATA { section DataQuickAccess };initialize by copy { readwrite, section .textrw, section CodeQuickAccess, section DataQuickAccess };
do not initialize { section .noinit };place at address mem: m_interrupts_start { readonly section .intvec };
place at address mem: m_boot_hdr_conf_start { section .boot_hdr.conf };
place at address mem: m_boot_hdr_ivt_start { section .boot_hdr.ivt };
place at address mem: m_boot_hdr_boot_data_start { readonly section .boot_hdr.boot_data };
place at address mem: m_boot_hdr_dcd_data_start { readonly section .boot_hdr.dcd_data };
place at address mem: m_boot_hdr_xmcd_data_start { readonly section .boot_hdr.xmcd_data };keep{ section .boot_hdr.conf, section .boot_hdr.ivt, section .boot_hdr.boot_data, section .boot_hdr.dcd_data, section .boot_hdr.xmcd_data};place in TEXT_region { readonly };
place in DATA3_region { block RW };
place in DATA3_region { block ZI };
if (isdefinedsymbol(__heap_noncacheable__)) {place in NCACHE_region { last block HEAP };
} else {place in DATA3_region { last block HEAP };
}
place in NCACHE_region { block NCACHE_VAR };
place in CSTACK_region { block CSTACK };
place in QACODE_region { block QACCESS_CODE };
place in DATA_region { block QACCESS_DATA };
下面来一段段分析上面的ICF文件。
2.2 define [exported] symbol和isdefinedsymbol
define symbol __ram_vector_table_size__ = isdefinedsymbol(__ram_vector_table__) ? 0x00000400 : 0;
define symbol __ram_vector_table_offset__ = isdefinedsymbol(__ram_vector_table__) ? 0x000003FF : 0;define symbol m_interrupts_start = 0x30002000;
define symbol m_interrupts_end = 0x300023FF;define symbol m_text_start = 0x30002400;
if (isdefinedsymbol(__use_flash64MB__)) {define symbol m_text_end = 0x33FFFFFF;
} else{define symbol m_text_end = 0x30FFFFFF;
}define symbol m_interrupts_ram_start = 0x20000000;
define symbol m_interrupts_ram_end = 0x20000000 + __ram_vector_table_offset__;define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__;
define symbol m_data_end = 0x2003FFFF;define symbol m_data2_start = 0x202C0000;
define symbol m_data2_end = 0x2033FFFF;define symbol m_data3_start = 0x80000000;
define symbol m_data3_end = 0x82FFFFFF;define symbol m_ncache_start = 0x83000000;
define symbol m_ncache_end = 0x83FFFFFF;define exported symbol __NCACHE_REGION_START = m_ncache_start;
define exported symbol __NCACHE_REGION_SIZE = m_ncache_end - m_ncache_start + 1;define symbol m_qacode_start = 0x00000000;
define symbol m_qacode_end = 0x0003FFFF;
这一段中出现了两个ICF语法:
(1)isdefinedsymbol(name)
:当name
被定义了返回1,否则返回0
(2)define symbol
:定义一个变量
- 语法:
define [ exported ] symbol name = expr;
- 参数:
name
为变量名,expr
为变量的值,exported
可省略,若定义则可以在程序中使用extern来获取此变量的值
现在来分析一下上面的链接文件:
(1)__ram_vector_table__
在其它地方没有定义,即__ram_vector_table_size__
和__ram_vector_table_offset__
的值都为0。所以,m_interrupts_ram_start
和m_interrupts_ram_end
都为0x20000000。
实际上,由于程序是运行在NOR Flash中的,程序镜像起始处的中断向量表也映射到了NOR Flash中,而不是保存在RAM中。所以实际上上面的这几个变量并没有被使用到,可以直接忽略。
真正使用的向量表变量是m_interrupts_start
(0x30002000
)和m_interrupts_end
(0x300023FF
),长度为0x3FF+1=0x400
,可以去启动的.s
数一下,程序最开始的向量长度确实是填充到了0x400处。
- 至于为什么向量表从NOR Flash的0x2000偏移处开始,这是因为I.MX系列单片机都需要一个IVT头供芯片固有的ROM BootLoader进行引导,这个头在使用NOR Flash XIP时,长度为0x2000。这里不用过多纠结。
(2)m_text_start
(0x30002400
)和m_text_end
(0x30FFFFFF
)紧跟着向量表,就是后续的代码段链接的位置了,大小为16MB。
(3)m_data_start
和m_data_end
;m_data2_start
和m_data2_end
;m_data3_start
和m_data3_end
;m_ncache_start
和m_ncache_end
;m_qacode_start
和m_qacode_end
这三个变量分别定义了DTCM
、OC2
、SDRAM
(可缓存部分)、SDRAM
(不可缓存部分)和ITCM
的内存起始和结束地址。
(4)__NCACHE_REGION_START
和__NCACHE_REGION_SIZE
:定义了不可缓存内存的起始和结束地址,这个部分用了export
,这是因为不可缓存部分需要在程序的MPU代码中进行配置。
接着往下分析:
/* 这里定义的是IVT头中不同参数的偏移,这里不做分析 */
define exported symbol m_boot_hdr_conf_start = 0x30000400;
define symbol m_boot_hdr_ivt_start = 0x30001000;
define symbol m_boot_hdr_boot_data_start = 0x30001020;
define symbol m_boot_hdr_dcd_data_start = 0x30001030;
define symbol m_boot_hdr_xmcd_data_start = 0x30001040;/* Sizes */
if (isdefinedsymbol(__stack_size__)) {define symbol __size_cstack__ = __stack_size__;
} else {define symbol __size_cstack__ = 0x0400;
}if (isdefinedsymbol(__heap_size__)) {define symbol __size_heap__ = __heap_size__;
} else {define symbol __size_heap__ = 0x0400;
}define exported symbol __VECTOR_TABLE = m_interrupts_start;
define exported symbol __VECTOR_RAM = isdefinedsymbol(__ram_vector_table__) ? m_interrupts_ram_start : m_interrupts_start;
define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__;
(1)__size_cstack__
和__size_heap__
为程序的栈、堆大小的相关变量,后面会使用到。
- 实际上在这个工程中使用了FreeRTOS,所以只需要保证这里面的栈大小能够运行FreeRTOS的初始化函数就行了,后面的堆、栈都由FreeRTOS管理,从分配给FreeRTOS的空间中分配。
(2)__VECTOR_TABLE
(0x30002000
)、__VECTOR_RAM
(0x30002000
)和__RAM_VECTOR_TABLE_SIZE
(0
)
将这三个变量export
给程序。实际上在这个工程中没有使用到这三个变量,这三个变量原本是用来将保存在Flash中的向量表拷贝到RAM中的,所以如果使用的是non-XIP的Flash,如NAND Flash,就会用到这三个变量。
2.3 define memory、define region、区域表达式和define block
先来看一下下面将新出现的ICF语法:
(1)define memory
:定义一块内存
- 语法:
define memory [ name ] with size = size_expr [ ,unit-size ];
- 参数:
name
为内存名,expr
为内存大小,unit-size
可省略,若定义它必须赋值为bitsize_expr
(位)或bytesize_expr
(字节),表示前面内存大小的单位,默认为字节。
(2)define region
:定义一块可以放置特定的代码段和数据段的区域。一个区域由一个或多个内存范围组成,每个内存范围都是在特定内存中连续的字节序列。
- 语法:
define [ ram | rom ] region_name = region-expr;
- 参数:
region_name
为区域名,[ ram | rom ]
可省略,分别表示该region为RAM或ROM。region-expr
是区域表达式,使用区域表达式可以组合多个内存范围,这些内存范围可以不连续,甚至不在同一块内存中。在(3)中介绍。
(3)区域表达式
- 语法:
[ memory-name: ][from expr { to expr | size expr } [ repeat expr [ displacement expr ]]]
- 参数:
memory-name
为内存区域的名称,如果只有一块内存,可省略此项;from expr { to expr | size expr
分别为内存区域的起始地址、终止地址和大小;repeat expr
表示同一个内存中分的多个内存范围;displacement expr
是repeat
序列中从前一个内存范围开始的偏移,默认大小为size
。
同时区域之间还可以有一些运算:
- A | B:A和B的并集
- A & B:A和B的交集
- A - B:A排除B的集合
(4)define block
:块指令定义了一个连续的内存区域,该区域可能包含一组可能为空的段或其他块。
语法:
define [ movable ] block name
[ with param, param... ]
{
extended-selectors
}
[ except
{
section-selectors
} ];其中param可以为下面之一:
size = expr
minimum size = expr
maximum size = expr
expanding size
alignment = expr
end alignment = expr
fixed order
alphabetical order
static base [basename]
块指令比较复杂,参数比较多,有很多参数也用不到,这里就不具体地解释每一个参数了,下面会直接通过解释例子中的几个块指令的含义来帮助大家看懂ICF文件。具体指令的定义可以参考手册p521的define block directive
。
继续往下分析ICF文件,接下来就是定义一些内存、区域和块:
/* 定义一整个大小为2^32=4G的内存,即芯片的最大寻址范围 */
define memory mem with size = 4G;
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]| mem:[from m_text_start to m_text_end];
define region QACODE_region = mem:[from m_qacode_start to m_qacode_end];
define region DATA_region = mem:[from m_data_start to m_data_end];
define region DATA2_region = mem:[from m_data2_start to m_data2_end];
define region DATA3_region = mem:[from m_data3_start to m_data3_end-__size_cstack__];
define region CSTACK_region = mem:[from m_data3_end-__size_cstack__+1 to m_data3_end];
define region NCACHE_region = mem:[from m_ncache_start to m_ncache_end];define block CSTACK with alignment = 8, size = __size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
define block RW { first readwrite, section m_usb_dma_init_data };
define block ZI with alignment = 32 { first zi, section m_usb_dma_noninit_data };
define block NCACHE_VAR { section NonCacheable , section NonCacheable.init };
define block QACCESS_CODE { section CodeQuickAccess };
define block QACCESS_DATA { section DataQuickAccess };
上面的脚本中定义了多个内存区域,其中TEXT_region
即代码段的范围,即NOR Flash中0x30002000后开始放代码的区域;QACODE_region
即ITCM的区域;DATA_region
即DTCM的区域;DATA2_region
即SRAM_OC2的区域;DATA3_region
即SDRAM的可cacheable区域;CSTACK_region
为栈的区域,这里定义为DATA3_region
的最后__size_cstack__
字节区域;NCACHE_region
即SDRAM的non-cacheable区域。
接下来就是定义多个block了,其中CSTACK
和HEAP
分别为栈和堆的块,它要求这里面的内存8字节对齐,大小分别为__size_cstack__
和__size_heap__
;RW
中的first
是一个extended-selectors
表达式(参考p540),这里表示将readwrite
块放置在包含RW
块(即RW
块的父集)的最前面,这里可以定义多个section-selectors
,用逗号隔开,所以后面的section m_usb_dma_init_data
定义了一个名为m_usb_dma_init_data
的section在这个块中;ZI
与RW
类似,它额外要求32字节对齐;NCACHE_VAR
、QACCESS_CODE
和QACCESS_DATA
都是定义了一个特定名称section在这个block中。
- 比如这里
section
定义的m_usb_dma_init_data
,可以在程序中使用#pragma(location=m_usb_dma_init_data)
或__attribute__((section("m_usb_dma_init_data")))
来定义变量到RW
中 readwrite
(RW
)、readonly
和zi
为ICF文件内置的三个block
,分别为读写段、只读段和bss段。readwrite
段默认包含了程序中有初始值的变量,readonly
段默认包含了程序的代码,zi
段默认包含了程序中没有初始值的变量。
2.4 initialize by copy和do not initialize
(1)initialize by copy
语法(具体参考P527):
initialize { by copy | manually }
[ with param, param... ]
{
section-selectors
}
[ except
{
section-selectors
} ];
这里的by copy
表示复制一个段,这也很好理解,比如对于RW段来说,只要不是bss段的有初始值的变量,这些初始值是会占据编译出来的image的大小的,也就是这些初始值是保存在Flash中,然后上电后再拷贝到RAM中的,这里定义的RW
段是RAM,所以再"copy"一段到Flash中。
(2)do not initialize
:与initialize by copy
相反,一般用于bss段
继续往下看ICF文件:
initialize by copy { readwrite, section .textrw, section CodeQuickAccess, section DataQuickAccess };
do not initialize { section .noinit };
就是根据定义的某个section
是否会存放有初始值的变量,手动定义section
到initialize by copy
或do not initialize
。
2.5 place at、keep和place in
(1)place at
[ "name": ]
place [ noload ] at { address [ memory: ] address |
start of region_expr [ with mirroring to mirror_address ] |
end of region_expr [ with mirroring to mirror_address ] }
{
extended-selectors
}
[ except
{
section-selectors
} ];
该指令用于将sections
和blocks
放置在特定地址或者区域的开头或末尾。
(2)keep
keep
{
[ { section-selectors | block name }
[ , {section-selectors | block name }... ] ]
}
[ except
{
section-selectors
} ];
这里的keep
和链接脚本ld文件中的keep
的作用一样,用于控制链接器在生成可执行文件或库时保留特定的sections
和blocks
,防止链接器优化过程中丢弃未被引用的sections
和blocks
。
(3)place in
[ "name": ]
place [ noload ] in region-expr
[ with mirroring to mirror_address ]
{
extended-selectors
}
[ except{
section-selectors
} ];
place in
会防止section
和block
到一个特定的区域。如果有多个section
和block
,则它们之间放置的顺序是随机的,如果想指定这个顺序可以用block
表达式,一般用不到。
继续往下看链接脚本:
place at address mem: m_interrupts_start { readonly section .intvec };
place at address mem: m_boot_hdr_conf_start { section .boot_hdr.conf };
place at address mem: m_boot_hdr_ivt_start { section .boot_hdr.ivt };
place at address mem: m_boot_hdr_boot_data_start { readonly section .boot_hdr.boot_data };
place at address mem: m_boot_hdr_dcd_data_start { readonly section .boot_hdr.dcd_data };
place at address mem: m_boot_hdr_xmcd_data_start { readonly section .boot_hdr.xmcd_data };
keep{ section .boot_hdr.conf, section .boot_hdr.ivt, section .boot_hdr.boot_data, section .boot_hdr.dcd_data, section .boot_hdr.xmcd_data};place in TEXT_region { readonly };
place in DATA3_region { block RW };
place in DATA3_region { block ZI };
if (isdefinedsymbol(__heap_noncacheable__)) {place in NCACHE_region { last block HEAP };
} else {place in DATA3_region { last block HEAP };
}
place in NCACHE_region { block NCACHE_VAR };
place in CSTACK_region { block CSTACK };
place in QACODE_region { block QACCESS_CODE };
place in DATA_region { block QACCESS_DATA };
上面的place at
就是将后面大括号里的section
放置到前面指定的地址中,而这些section
可以在程序中使用例如__attribute__((section(".boot_hdr.boot_data"), used))
的语句放置到指定段中。这里的几个段实际上是I.MX RT系列单片机的启动头,通过这种方式可以在C文件中更改启动头的内容。
- 上面定义的6个
section
应该都是readonly
才对,我的猜测是可写可不写,因为这里已经强制了放置的地址,这里的地址都在Flash,应该默认就已经表示都是readonly
。可惜IAR没有生成像Makefile那样标准的链接脚本,不然可以对比一下前后的差别。
后面的place in
就是将前面定义的各个block
(由多个section
组成)放置到前面定义的各个region
(代表一个或多个地址范围)中。其中last block HEAP
中的last
和前面遇到的first
一样,也是extended-selectors
中的定义,表示放置该region
的最后面。
相关文章:

嵌入式IDE(1):IAR中ICF链接文件详解和实例分析
最近在使用NXP的提供的MCUXPresso IDE,除了Eclipse固有的优点外,我觉得它最大的优点就是在链接脚本的生成上,提供了非常直观的GUI配置界面。但这个IDE仅仅支持NXP相关的产品,而且调试的性能在某些情况下并不理想。而我们用得比较多…...

分布式版本控制工具——git
✅<1>主页::我的代码爱吃辣 📃<2>知识讲解:Linux——git ☂️<3>开发环境:Centos7 💬<4>前言:git是一个开源的分布式版本控制系统,可以有效、高速地处理从很…...

C基础-数组
1.一维数组的创建和初始化 int main() {// int arr1[10];int n 0;scanf("%d",&n);//int count 10;int arr2[n]; //局部的变量,这些局部的变量或者数组是存放在栈区的,存放在栈区上的数组,如果不初始化的话,默认…...

springboot项目配置flyway菜鸟级别教程
1、Flyway的工作原理 Flyway在第一次执行时,会创建一个默认名为flyway_schema_history的历史记录表,这张表会用来跟踪或记录数据库的状态,然后每次项目启动时都会自动扫描在resources/db/migration下的文件的版本号并且通过查询flyway_schem…...

成都精灵云初试
最近参加了成都精灵云的笔试与面试,岗位是c工程师。后面自己复盘了过程,初试部分总结如下,希望能对各位相进该公司以及面试C工程师的同学提供一些参考。这也是博主第一次参加面试,很多东西都还没准备,很多答得不好&…...

css relative 和absolute布局
1、relative和absolute内部的元素都是相对于父容器,若父容器没有指定为relative,则默认为整个文档视图空间,absolute可以重叠元素,relative则不行。relative意味着元素的任意属性如left和right都是相对于其他元素的。absolute则相…...

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验
低价又好用的护眼台灯是多数人的需求,很多人只追求功能性护眼台灯,显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到,然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯,拥有高品质光源ÿ…...

经管博士科研基础【19】齐次线性方程组
1. 线性方程组 2. 非线性方程组 非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系、对数关系、指数关系、三角函数关系等等。求解此类方程往往很难得到精确解,经常需要求近似解问题。相应的求近似解的方法也逐渐得到大家的重视。 3. 线…...

django报错解决 Forbidden (403) CSRF verification failed. Request aborted.
django报错解决 Forbidden (403) CSRF verification failed. Request aborted. 报错内容 Forbidden (403) CSRF verification failed. Request aborted.Help Reason given for failure:Origin checking failed - https://active-mantis-distinct.ngrok-free.app does not mat…...

k8s-实战——yapi平台部署
文章目录 k8s 部署yapi平台前言准备工作构建yapi镜像Dockerfileentrypoint.shbuild.sh源码下载构建镜像启动mongo数据库新建nfs服务mongo创建mongo服务初始化数据启动yapi服务创建yapi服务查看密码访问地址k8s 部署yapi平台 前言 部署yapi平台需要mo...

Excel VSTO开发5 -Excel对象结构
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 5 Excel对象结构 Excel提供了几个比较重要的对象: Application、Workbooks、Workbook、Worksheets、Worksheet 为了便…...

Javafx集成sqlite数据库
什么是SQLite SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准。SQLite在使用前不需要安装设置,不需要进程来启动、停止或配置,而其他大多数SQL数据库引擎是作为一个单独的服务器进程,被程序使用某种内部进程通信(典型…...

react-native实现 TextInput 键盘显示搜索按钮并触发回调
<TextInput returnKeyType"search"returnKeyLabel"搜索"onSubmitEditing{e > {toSearch(keyword);}} /><SearchBarref{serachBarEl}placeholder"请输入"onChangeText{handleChangeSearch}value{search}onSubmitEditing{handleSearch…...

人大金仓分析型数据库备份和恢复(五)
增量备份 gpbackup和gprestore工具支持创建追加优化表的增量备份以及从增量备份还原。 只有表被更改时,增量备份才会备份所有指定的堆表和追加优化的表(包括追加优化的,面向列的表)。 例如,如果追加优化表的行已更改&a…...

lenovo联想笔记本ThinkPad P16V Gen 1(21FC,21FD)原装出厂Win11系统
原厂W11系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 链接:https://pan.baidu.com/s/17dTExDSz-EDN4Qd-PZGJuw?pwdrgl3 提取码:rgl3 所需要工具:32G或以上的U盘 文件格式:ISO 文件大小…...

Django实现音乐网站 ⒃
使用Python Django框架制作一个音乐网站, 本篇主要是歌手详情页-专辑列表、专辑详情-单曲列表开发实现内容。 目录 歌手详情-专辑列表 路由设置 跳转设置 视图方法 模板内容 专辑详情-单曲列表 设置路由 视图处理并返回 模板渲染 分页优化 引入错误类型库…...

【开发问题系列】CSV转Excel
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

mysql物理备份步骤
原库10.153.88.5,新建数据库实例10.153.88.6,注意/etc/my.cnf配置和88.5一致,测试目的是通过copy数据文件到88.6来恢复数据库。 在数据库10.153.88.5打包数据文件: [mysqlt3-dtpoc-dtpoc-web04 mysql]$ cd /testdata/mysql [mys…...

react使用hook封装一个tab组件
目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…...

java详细安装教程(供参考)一一java(jdk)安装
一、java历史简介 1991 年Sun公司的James Gosling等人开始开发名称为 Oak (橡树)的语言。希望用于控制嵌入在有线电视交换盒、PDA等的微处理器, 1994年将Oak语言更名为Java 1998年JDK1.2时,更名为Java 2 Platform 分为标准版J…...

C++函数内联详解
本文旨在讲解C中的函数内联相关知识,读完这篇文章,希望读者们会对函数内联有更深一步的认识! 内联函数的定义 在计算机科学中, 内联函数 (有时称作 在线函数 或 编译时期展开函数 )是一种编程语言结构&…...

Revit SDK 介绍:NewForm 新建体量
前言 这个例子介绍如何新建体量。 内容 图形生成效果。 用 Extrusion 创建体量 // 创建一个轮廓 ReferenceArray ref_ar new ReferenceArray(); // 创建三条直线,并放入轮廓 Autodesk.Revit.DB.XYZ ptA new Autodesk.Revit.DB.XYZ(10, 10, 0); Autodesk.Rev…...

Ubuntu离线或在线安装Python解释器
这里以安装Python3.5.7为例。 首先进入官网,下载Python-3.5.7.tgz,或者使用以下命令下载(需要联网): wget https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz下载完成后,使用以下命令进行解压缩…...

微信小程序隐私协议相关接口实际使用方式
<view wx:if"{{showPrivacy}}" class"privacy"><view class"popup"><view>隐私弹窗内容....</view><view bindtap"openPrivacyAgreement">点击查看隐私协议</view><button id"disagreeBt…...

MySQL--MySQL表的增删改查(进阶)
check 聚合查找 count sum average max min 我们这里先构造出多张表 查询lisi同学的成绩 来自student和来自score c 增加名字这一条件 查询所有同学的总成绩以及个人信息 来自score和来自student 查询所有同学的各科成绩以及个人信息 来自student,course和…...

Golang 中的静态类型和动态类型
定义说明 静态类型(static type):在编码时就能确定的类型,通过变量定义可以确定的类型;动态类型(concrete type):在运行时才能确定具体的数据类型; 动态静态类型如何理…...

docker的数据卷、docker数据持久化
目录 前言docker数据持久化的2种方式数据卷 bind mount ,即-v参数匿名数据卷 docker manager volume-v参数和匿名卷的区别docker volume 命令的使用数据卷容器孤儿volume总结 前言 环境:centos7.9 docker version 20.10.14 本篇我们来介绍docker的数据卷…...

阅读源码工具Sourcetrail
收费工具Source Insight、Understand Sourcetrail开源工具 一、下载安装 接下来就是download,在GitHub的release页面选择自己系统对应的发布版本下载安装: 安装好后,运行程序,会出现这样的界面: 二、应用 选择“New…...

KMP 算法详解
KMP算法详解 1 KMP算法解决的问题 2 前缀问题 3 KMP 算法 1 KMP算法解决的问题 字符串str1和str2,str1是否包含str2,如果包含返回str2在str1中开始的位置。并做到时间复杂度为 O ( n ) O(n) O(n) 2 前缀问题 求一个字符串中每个字符前缀和后缀相…...

[matconvnet]matconvnet-1.0-beta-25在cuda11.1以上编译问题总结
首先可以肯定是matconvnet-1.0-beta-25不支持cuda11.1及其以上版本,因为cudnn版本问题导致源码api接口不一样,会下面类似报错 E:\Matlab\R2020a\matconvnet-1.0-beta25\matlab\src\bits\datacu.hpp(89): error: identifier "cudnnConvolutionFwdPr…...