01:2440----点灯大师
目录
一:点亮一个LED
1:原理图
2:寄存器
3:2440的框架和启动过程
A:框架
B:启动过程
4:代码
5:ARM知识补充
6:c语言和汇编的应用
A:代码
B:分析汇编语言
C:内存空间
7:内部机制
二:点亮2个灯
三:流水灯
四:按键控制LED
1:原理图
2:寄存器配置
3:代码
一:点亮一个LED
1:原理图
当LED输入低电平时出现电压差, LED被点亮 (n的意思是低电平有效)
LED1 LED2 LED4分别接在 GPF4,5,6的IO口上
2:寄存器
配置GPFCON寄存器的[9:8]位为0b01-----输出模式 ; GPFCON--设置串口的模式
GPFDAT寄存器: 当该端口配置为输入端口时,对应的位为引脚状态。当端口配置为输出端口时,引脚状态与对应的位相同。当端口配置为功能引脚时,将读取未定义值。
GPF4对应GPFDAT寄存器的第4位, GPF[4]----0低电平/1高电平
GPFDAT寄存器--设置串口具体输出的内容
3:2440的框架和启动过程
A:框架
注意: CPU----里面有许多寄存器(R0~R15) ; 在CPU里面的寄存器是可以直接访问的.
GPIO控制器----里面有各种引脚,当然也包括我们今天使用的GPF4引脚; GPIO控制器里面也有寄存器(GPFCON, GPCDAT),不过这里面的寄存器需要地址访问, 不能向CPU里面的寄存器直接访问. 在芯片手册中有寄存器的地址.
B:启动过程
大多数的ARM芯片都是从0地址启动的, 当然这也包括我们讲述的2440
NOR启动 : NOR Flash基地址为0 , 片内RAM的地址为0x4000 0000
CPU读取出NOR第一个指令(前4个字节),执行
CPU继续在读取出其他的指令在执行; 一边读取一边执行
Nand启动 : 片内4KARM基地址为0, NOR启动不可访问
2440硬件把Nand的前4K内容复制到片内RAM上, 然后CPU从0地址取出第条指令执行
4:代码
/*
*点亮一个LED
*/
.text
.global _start_start:
/* 配置GPFCON(0X56000050)寄存器的[9:8]位为01--输出模式*/ldr r1,=0X56000050ldr r0,=0x100str r0,[r1]
/*
*配置GPFDAT寄存器为低电平(0x56000054)--输出低电平
*/ldr r1,=0x56000054ldr r0,=0str r0,[r1]/*死循环*/
halt:b halt
我们采用的是交叉编译的方法---使用window书写汇编代码-----将汇编代码传给虚拟机-----在虚拟机下将传来的汇编代码编译为bin文件-----在将bin文件传给window-------window烧写bin文件给Linux开发板; 我们使用的是GPIO控制器里面的寄存器所以必须使用地址进行访问
5:ARM知识补充
程序计数器 R15: 寄存器 R15 保存程序计数器(PC),它总是用于特殊的用途。它经常可用于通用寄存器RO~R14 所使用的位置(即在指令编码中 R15 与 RO~R14 的地位一样,只是指令执行的结果不同),因此,可以认为它是一个通用寄存器。但是对于它的使用还有许多与指令相关的限制或特殊情况。这些将在具体的指令描述中介绍。通常,如果 R15 使用的方式超出了这些限制,那么指令将是不可预测的。
当指令对 R15 的读取没有超过任何对 R15 使用的限制时,读取的值是指令的地址加上 8个字节。由于 ARM 指令总是以字为单位,结果的 Bit[1:0]总是为 0。这种读取 PC 的方式主要用于对附近的指令和数据进行快速、与位置无关的寻址,包括程序中与位置无关的转移。
当使用 STR或 STM 指令保存 R15 时,出现了上述规则的一个例外。这些指令可将指令地址加 8字节保存(与其它指令读取 R15 一样)或将指令自身地址加 12 字节(将来还可能出现别的数据)。偏移量 8 还是 12(或是其它数值)取决于 ARM 的实现(也就是说,与芯片有关)。对于某个具体的芯片,它是个常量。这样使用 STR 和 STM 指令是不可移植的。
由于这个例外,最好避免使用 STR 和 STM 指令来保存 R15。如果很难做到,那么应当在程序中使用合适的指令序列来确定当前使用的芯片所使用的偏移量
在2440中R15(pc)的偏移量为8, 注意取决于他对数据的读取方式
x的地址=x的地址+8
当他在读取地址A指令的时候
已经在对地址A+4的指令进行译码
已经在读取地址A+8的指令
分析反汇编的代码:
led_on.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:0: e59f1014 ldr r1, [pc, #20] ; 1c <halt+0x4>4: e3a00c01 mov r0, #256 ; 0x1008: e5810000 str r0, [r1]c: e59f100c ldr r1, [pc, #12] ; 20 <halt+0x8>10: e3a00000 mov r0, #014: e5810000 str r0, [r1]00000018 <halt>:18: eafffffe b 18 <halt>1c: 56000050 undefined instruction 0x5600005020: 56000054 undefined instruction 0x56000054
由于我们使用的是伪指令; 他是不存在的指令,最会被拆分真正的几条ARM指令;
上面的汇编代码都是由伪指令拆分而来的
优点 : 他可以表示任意值;
ARM指令===>32位,但是如果使用MOV的话并不能表示32位, 因为MOV32位中的一些位是用来表示他自己的,剩下的不够32位, 剩下的不够32位也只能表示一些立即数
ldr r1,=0X56000050=====>伪指令
6:c语言和汇编的应用
A:代码
我们需要写一个汇编代码, 给main函数设置内存, 调用main函数
int main()
{unsigned int *pGPFCON = (unsigned int *)0x56000050;unsigned int *pGPFDAT = (unsigned int *)0x56000054;/* 配置GPF4为输出引脚 */*pGPFCON = 0x100;/* 设置GPF4输出0 */*pGPFDAT = 0;return 0;
}
.text
.global _start_start:/* 设置内存: sp 栈 */ldr sp, =4096 /* nand启动 */
// ldr sp, =0x40000000+4096 /* nor启动 *//* 调用main */bl mainhalt:b halt
all:arm-linux-gcc -c -o led.o led.carm-linux-gcc -c -o start.o start.Sarm-linux-ld -Ttext 0 start.o led.o -o led.elfarm-linux-objcopy -O binary -S led.elf led.binarm-linux-objdump -D led.elf > led.dis
clean:rm *.bin *.o *.elf *.dis
我们使用makefile来编译, 避免重复多次的编译
可以看到x.ids文件中的地址和给板子烧录的bin文件地址一致;
B:分析汇编语言
r0~r3寄存器负责----调用者和被调用者的传递参数的问题;
r4~r11寄存器在函数中,可能被使用, 所以在人口中保存他们, 在出口中恢复他们;
led.elf: file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0: e3a0da01 mov sp, #4096 ; 0x10004: eb000000 bl c <main>00000008 <halt>:8: eafffffe b 8 <halt>0000000c <main>:c: e1a0c00d mov ip, sp10: e92dd800 stmdb sp!, {fp, ip, lr, pc}14: e24cb004 sub fp, ip, #4 ; 0x418: e24dd008 sub sp, sp, #8 ; 0x81c: e3a03456 mov r3, #1442840576 ; 0x5600000020: e2833050 add r3, r3, #80 ; 0x5024: e50b3010 str r3, [fp, #-16]28: e3a03456 mov r3, #1442840576 ; 0x560000002c: e2833054 add r3, r3, #84 ; 0x5430: e50b3014 str r3, [fp, #-20]34: e51b2010 ldr r2, [fp, #-16]38: e3a03c01 mov r3, #256 ; 0x1003c: e5823000 str r3, [r2]40: e51b2014 ldr r2, [fp, #-20]44: e3a03000 mov r3, #0 ; 0x048: e5823000 str r3, [r2]4c: e3a03000 mov r3, #0 ; 0x050: e1a00003 mov r0, r354: e24bd00c sub sp, fp, #12 ; 0xc58: e89da800 ldmia sp, {fp, sp, pc}
Disassembly of section .comment:00000000 <.comment>:0: 43434700 cmpmi r3, #0 ; 0x04: 4728203a undefined8: 2029554e eorcs r5, r9, lr, asr #10c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}10: Address 0x10 is out of bounds.
C:内存空间
内存空间被分为三个部分:代码段(text segment,即程序代码)、数据段(data segment,即变量)和栈段(stack segment)。数据段从下往上增长,而栈从上向下增长图。在这两者之间是空闲的地址空间。栈的增长是随着程序的执行自动进行的,而数据的扩展则需要通过brk 系统调用来显式地完成,brk有一个参数来指定数据段的结束地址,它可比当前值大(表示扩展数据段 ),或是比当前值小(表示缩小数据段 )。当然,这个参数必须小于指针,否则栈和数据段将会重叠,这是不允许的。
7:内部机制
二:点亮2个灯
上面我们实现了被调用者给调用者传递参数;
我们这里学习---调用者给被调用者传递参数
int len_on(int num)
{/*设置寄存器 点亮LED2*/unsigned int* GPFCON = 0x56000050;unsigned int* GPFDAT = 0x56000054;if (num == 4){/*设置输出模式*/*GPFCON = 0x100;}if (num == 5){/*设置输出模式*/*GPFCON = 0x400;}/*输出低电平*/*GPFDAT = 0;return 0;
}
void Delay(int n)
{while (n--);
}
/*
*点亮一个LED
*/
.text
.global _start_start:/*设置内存: sp栈*/ldr sp,=4096 /*nand启动*/ldr sp,=0x40000000+4096/*nor启动*/mov r0 ,#4bl len_onldr r0 ,=10000bl Delaymov r0 ,#5bl len_onhalt:b halt
led.elf: file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0: e3a0da01 mov sp, #4096 ; 0x10004: e59fd018 ldr sp, [pc, #24] ; 24 <halt+0x4>8: e3a00004 mov r0, #4c: eb000006 bl 2c <len_on>10: e59f0010 ldr r0, [pc, #16] ; 28 <halt+0x8>14: eb000022 bl a4 <Delay>18: e3a00005 mov r0, #51c: eb000002 bl 2c <len_on>00000020 <halt>:20: eafffffe b 20 <halt>24: 40001000 andmi r1, r0, r028: 00002710 andeq r2, r0, r0, lsl r70000002c <len_on>:2c: e52db004 push {fp} ; (str fp, [sp, #-4]!)30: e28db000 add fp, sp, #034: e24dd014 sub sp, sp, #2038: e50b0010 str r0, [fp, #-16]3c: e59f3058 ldr r3, [pc, #88] ; 9c <len_on+0x70>40: e50b300c str r3, [fp, #-12]44: e59f3054 ldr r3, [pc, #84] ; a0 <len_on+0x74>48: e50b3008 str r3, [fp, #-8]4c: e51b3010 ldr r3, [fp, #-16]50: e3530004 cmp r3, #454: 1a000002 bne 64 <len_on+0x38>58: e51b300c ldr r3, [fp, #-12]5c: e3a02c01 mov r2, #256 ; 0x10060: e5832000 str r2, [r3]64: e51b3010 ldr r3, [fp, #-16]68: e3530005 cmp r3, #56c: 1a000002 bne 7c <len_on+0x50>70: e51b300c ldr r3, [fp, #-12]74: e3a02b01 mov r2, #1024 ; 0x40078: e5832000 str r2, [r3]7c: e51b3008 ldr r3, [fp, #-8]80: e3a02000 mov r2, #084: e5832000 str r2, [r3]88: e3a03000 mov r3, #08c: e1a00003 mov r0, r390: e28bd000 add sp, fp, #094: e8bd0800 pop {fp}98: e12fff1e bx lr9c: 56000050 undefined instruction 0x56000050a0: 56000054 undefined instruction 0x56000054000000a4 <Delay>:a4: e52db004 push {fp} ; (str fp, [sp, #-4]!)a8: e28db000 add fp, sp, #0ac: e24dd00c sub sp, sp, #12b0: e50b0008 str r0, [fp, #-8]b4: e51b3008 ldr r3, [fp, #-8]b8: e3530000 cmp r3, #0bc: 03a03000 moveq r3, #0c0: 13a03001 movne r3, #1c4: e20330ff and r3, r3, #255 ; 0xffc8: e51b2008 ldr r2, [fp, #-8]cc: e2422001 sub r2, r2, #1d0: e50b2008 str r2, [fp, #-8]d4: e3530000 cmp r3, #0d8: 1afffff5 bne b4 <Delay+0x10>dc: e28bd000 add sp, fp, #0e0: e8bd0800 pop {fp}e4: e12fff1e bx lrDisassembly of section .ARM.attributes:00000000 <.ARM.attributes>:0: 00002541 andeq r2, r0, r1, asr #104: 61656100 cmnvs r5, r0, lsl #28: 01006962 tsteq r0, r2, ror #18c: 0000001b andeq r0, r0, fp, lsl r010: 00543405 subseq r3, r4, r5, lsl #814: 01080206 tsteq r8, r6, lsl #418: 04120109 ldreq r0, [r2], #-265 ; 0x1091c: 01150114 tsteq r5, r4, lsl r120: 01180317 tsteq r8, r7, lsl r324: Address 0x00000024 is out of bounds.Disassembly of section .comment:00000000 <.comment>:0: 3a434347 bcc 10d0d24 <__bss_end__+0x10c8c3c>4: 74632820 strbtvc r2, [r3], #-2080 ; 0x8208: 312d676e teqcc sp, lr, ror #14c: 312e362e teqcc lr, lr, lsr #1210: 2e342029 cdpcs 0, 3, cr2, cr4, cr9, {1}14: 00332e34 eorseq r2, r3, r4, lsr lr
对于2440他的内部同样存在看门狗, 我们在程序中没有对看门狗进行操作; 所以他在一段时间就会复位.
三:流水灯
void Delay(int n)
{while (n--);
}int main(void)
{int i = 4;/*设置寄存器 点亮LED2*/volatile unsigned int* GPFCON = (volatile unsigned int*)0x56000050;volatile unsigned int* GPFDAT = (volatile unsigned int*)0x56000054;/*设置GPF4/5/6位位输出模式*/*GPFCON &= ~((3 << 8) | (3 << 10) | (3 << 12)); //3对应0b11 清位*GPFCON |= ((1 << 8) | (1 << 10) | (1 << 12)); //置1-设置位输出模式/*GPFDAT寄存器配置 */*GPFDAT &= ~((1 << 4) | (1 << 5) | (1 << 6)); //清位*GPFDAT |= ((1 << 4) | (1 << 5) | (1 << 6)); //把GPFDAT寄存器的4 5 6 位置1--灭灯/*led4 0x100 led5 0x400 */while (1){ if (i == 7)i = 4;*GPFDAT &= ~(1 << i);Delay(10000);*GPFDAT |= (1 << i);Delay(10000);i++; }return 0;
}
/*
*点亮一个LED
*/
.text
.global _start_start:
/* 关闭看门狗 */ldr r0, =0x53000000ldr r1, =0str r1, [r0]/*设置内存: sp栈* 我们判断是nor启动还是nand启动/mov r1, #0ldr r0, [r1] /* 读出原来的值备份 */str r1, [r1] /* 0->[0] */ ldr r2, [r1] /* r2=[0] */cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */ldr sp, =0x40000000+4096 /* 先假设是nor启动 */moveq sp, #4096 /* nand启动 */streq r0, [r1] /* 恢复原来的值 */bl mainhalt:b halt
1:看门狗问题的解决
看门狗定时器控制(WTCON)寄存器WTCON寄存器允许用户启用/禁用看门狗定时器,选择来自4个不同源的时钟信号,启用/禁用中断,启用/禁用看门狗定时器输出。看门狗定时器用于S3C2440A上电后功能异常重启时恢复;如果不希望控制器重启,则关闭看门狗定时器
我们可以看到当 Reset enable/disable (重新启用/禁用) 设置WTCON寄存器位0时, 2400就会关闭我们的寄存器
2:如何区分是nar启动还是nand启动
nor启动 : 可以向内存一样读, 但是不能向内存一样写; (如果一定要写的话需要发送一定格式的数据才可以写)
nand : 可读取写
方法: 分辨是nor/nand启动
* 写0到0地址, 再读出来
* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动 (nand-- 可读取写)
* 否则就是nor启动 (只能读)
四:按键控制LED
1:原理图
平时他为高电平, 当按键按下他为低电平;
2:寄存器配置

GPF
按键位输入模式
3:代码
void Delay(int n)
{while (n--);
}#define GPFCON (*((volatile unsigned int*)0x56000050))
#define GPFDAT (*((volatile unsigned int*)0x56000054))
#define GPGCON (*((volatile unsigned int*)0x56000060))
#define GPGDAT (*((volatile unsigned int*)0x56000064))
int main(void)
{/*volatile unsigned int* GPFCON = (volatile unsigned int*)0x56000050;volatile unsigned int* GPFDAT = (volatile unsigned int*)0x56000054;volatile unsigned int* GPGCON = (volatile unsigned int*)0x56000060;volatile unsigned int* GPGDAT = (volatile unsigned int*)0x56000064;*//*设置GPF4/5/6位p 位输出模式*/GPFCON &= ~((3 << 8) | (3 << 10) | (3 << 12)); //3对应0b11 清位GPFCON |= ((1 << 8) | (1 << 10) | (1 << 12)); //置1-设置位输出模式/*设置GPF0和GPF2按键位输入模式*/GPFCON &= ~((3 << 0) | (3 << 4));/*GPG3位输入模式*/GPGCON &= ~(3 << 6);while (1){ if (GPFDAT & (1 << 0)) /* s2 --> gpf6 */{/* 松开 */GPFDAT |= (1 << 6);}else{/* 按下 */GPFDAT &= ~(1 << 6);}if (GPFDAT & (1 << 2)) /* s3 --> gpf5 */{/* 松开 */GPFDAT |= (1 << 5);}else{/* 按下 */GPFDAT &= ~(1 << 5);}if ((GPGDAT & (1 << 3))==0) /* s4 --> gpf4 */{/* 按下 */GPFDAT &= ~(1 << 4);}else{/* 松开 */GPFDAT |= (1 << 4); }}return 0;
}
/*
*点亮一个LED
*/
.text
.global _start_start:
/* 配置GPFCON(0X56000050)寄存器的[9:8]位为01--输出模式*/ldr r1,=0X56000050ldr r0,=0x100str r0,[r1]
/*
*配置GPFDAT寄存器为低电平(0x56000054)--输出低电平
*/ldr r1,=0x56000054ldr r0,=0str r0,[r1]/*死循环*/
halt:b halt
相关文章:

01:2440----点灯大师
目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…...

初步了解 RabbitMQ
目录 编辑一、MQ 概述 1、MQ 的简介 2、MQ 的用途 (1)限流削峰 (2)异步解耦 (3)数据收集 二、RabbitMQ 概述 1、RabbitMQ 简介 2、四大核心概念 3、RabbitMQ 的核心部分 编辑 4、名词解释: 三、Hello …...
Faster-RCNN and Mask-RCNN框架解析
由于本人记忆力实在太差,每次学完一个框架没过多久就会忘,而且码文能力不行,人又懒,所以看到了其他人写的不错的两篇框架解析的博文,先来记录一下,就当是我写的喽 Faster-rcnn详解_faster r-cnn-CSDN博客 M…...

大数据可视化数据大屏可视化模板【可视化项目案例-05】
🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…...
Vue Router active-class 属性
active-class 是 vue-router 模块的 router-link 组件的属性,当 router-link 标签被点击时将会应用这个样式。 单独在 router-link 标签上使用 active-class 属性 <router-link to"/about" active-class"active">about</router-link…...

Error creating bean with name ‘apiModelSpecificationReader‘ defined in URL
问题: 启动项目的时候,报错了 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name apiModelSpecificationReader defined in URL [jar:file:/D:/.gradle/caches/modules-2/files-2.1/io.springfox/sp…...

CS224W6.2——深度学习基础
在本文中,我们回顾了深度学习的概念和技术,这些概念和技术对理解图神经网络至关重要。从将机器学习表述为优化问题开始,介绍了目标函数、梯度下降、非线性和反向传播的概念。 文章目录 1. 大纲2. 优化问题2.1 举例损失函数 3. 如何优化目标函…...
Linux c/c++服务器开发实践
在Linux C开发环境中,通常有两种方式来开发多线程程序,一种是利用POSIX多线程 API函数来开发多线程程序,另外一种是利用C自带线程类来开发程序。 常见的与线程相关的基本API函数: API函数含义pthread_create创建线程pthread_exi…...

2023年11月在线IDE流行度最新排名
点击查看最新在线IDE流行度最新排名(每月更新) 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…...

视频批量剪辑:视频嵌套合并实战指南,剪辑高手速成秘籍
随着社交媒体的兴起,视频制作的需求越来越广泛。无论是个人用户还是专业团队,都需要对视频进行剪辑以符合其需求。而在这个过程中,批量剪辑视频的能力就变得至关重要。视频批量剪辑是指在一次操作中处理多个视频文件的剪辑。通过使用专业的视…...

每天一点python——day66
#每天一点Python——66 #字符串的分隔 #如图: #方法①split()从左开始分隔,默认空格为分割字符,返回值是一个列表 shello world jisuanji#首先创建一个字符串 list1s.split() print(list1)#输出结果是:[hello, world, jisuanji]注…...

搭建产品帮助中心其实很简单,方法都在这了!
网站帮助中心是一个为用户提供支持和解答问题的重要资源。它不仅可以提高用户体验,还能减少用户问题反馈的数量。通过提供清晰、易于理解的文档和指南,帮助中心可以帮助用户更好地了解产品或服务,并解决他们在使用过程中遇到的问题。接下来我…...

(离散数学)命题及命题的真值
答案: (5)不是命题,因为真值不止一个 (6)不是命题,因为不是陈述句 (7)不是命题,因为不是陈述句 (8)不是命题,真值不唯一...

计算机组成原理之处理器(流水线)
引言 为什么不采用单周期实现,硬件比较简单? 主要是因为效率太低,处理器中最长的路径(一般是ld指令)决定了时钟周期 流水线概述 流水线是一种能使多条指令重叠执行的技术。 流水线更快的原因是所有的工作都在并行执行,所以单位…...

国际阿里云:云服务器灾备方案!!!
保障企业业务稳定、IT系统功能正常、数据安全十分重要,可以同时保障数据备份与系统、应用容灾的灾备解决方案应势而生,且发展迅速。ECS可使用快照、镜像进行备份。 灾备设计 快照备份 阿里云ECS可使用快照进行系统盘、数据盘的备份。目前,阿…...

计算机msvcp140.dll重新安装的四个解决方法,专门解决dll文件丢失问题的方法
在我多年的电脑使用经历中,曾经遇到过一个非常棘手的问题,那就是电脑提示找不到msvcp140.dll文件。这个问题让我苦恼了很久,但最终还是找到了解决方法。今天,我就来分享一下我解决这个问题的四种方法,希望对大家有所帮…...
提莫的idea的bug是真滴多
问题1:maven reload功能失效 我复制了一段代码到我项目里,这段代码依赖hutool包,于是我用idea快速导入,自动导入的是hutool-all:5.8.4。后来我发现这段还是有个函数报错,需要导入更高版本的hutool包才行,于…...

STM32笔记—EXTI外部中断
一、简介 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行; 中断优先级&…...
小程序分享当前页面
小程序分享页面的时候,大部分的资料都是显示的是onShareAppMessage 这个方法 /*** 用户点击右上角分享*/onShareAppMessage(res) {return {title: 您的好友向您分享了一本通讯录: this.data.setting.name,imageUrl: this.data.setting.share_img,path: pages/shar…...

10. GPIO中断
10. GPIO中断 回顾stm32中断系统STM32中断向量表中断向量偏移NVIC中断控制器 Cortex_A7 中断系统中断向量表GIC控制器中断IDGIC逻辑分块CP15协处理器c0寄存器c1寄存器c12寄存器c15寄存器 中断使能中断优先级设置优先级数配置 GICC_PMR抢占优先级和子优先级位数设置 GICC_BPR优先…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...