I.MX6ULL的官方 SDK 移植實驗

系列文章目錄

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.pswp.cn/bicheng/15815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15815.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15815.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

列表元素添加的藝術:從單一到批量

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言 二、向列表中添加單一元素 1. append方法 2. insert方法 三、向列表中添加批量…

MySQL 存儲過程(實驗報告)

一、實驗名稱&#xff1a; 存儲過程 二、實驗日期&#xff1a; 2024 年5 月 25 日 三、實驗目的&#xff1a; 掌握MySQL存儲過程的創建及調用&#xff1b; 四、實驗用的儀器和材料&#xff1a; 硬件&#xff1a;PC電腦一臺&#xff1b; 配置&#xff1a;內存&#xff0…

Android 配置本地解決下載 Gradle 慢的問題

步驟1 打開項目下 gradle/wrapper/gradle-wrapper.properties 文件。 步驟2 文件內容如下。 #Sat May 25 16:24:00 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin…

SW焊接路徑不能是閉合的

如果是整個圓,就不能作出焊件

【Docker學習】深入研究命令docker exec

使用docker的過程中&#xff0c;我們會有多重情況需要訪問容器。比如希望直接進入MySql容器執行命令&#xff0c;或是希望查看容器環境&#xff0c;進行某些操作或訪問。這時就會用到這個命令&#xff1a;docker exec。 命令&#xff1a; docker container exec 描述&#x…

ssm275寵物醫院管理系統+vue-手把手調試搭建

ssm275寵物醫院管理系統vue-手把手調試搭建 ssm275寵物醫院管理系統vue-手把手調試搭建

Jmeter預習第1天

Jmeter參數化&#xff08;重點&#xff09; 本質&#xff1a;使用參數的方式來替代腳本中的固定為測試數據 實現方式&#xff1a; 定義變量&#xff08;最基礎&#xff09; 文件定義的方式&#xff08;所有測試數據都是固定的情況下[死數據]&#xff0c;eg:注冊登錄&#xff0…

Linux -- 進程間通信的五種方式

IPC&#xff08;InterProcess Communication&#xff09;的方式通常有管道&#xff08;包括無名管道和命名管道&#xff09;、消息隊列、信號量、共享存儲、Socket、Streams等。其中Socket和Stream支持不同主機上的兩個進程IPC。 管道&#xff08;Pipes&#xff09;&#xff1a…

STM32中斷編程入門

文章目錄 一、 理論部分1.中斷系統2.中斷執行流程3.NVIC的基本結構4.EXTI介紹5.AFIO復用IO口 二、實驗目的&#xff1a;學習stm32中斷原理和開發編程方法。使用標準完成以下任務&#xff1a;&#xff08;一&#xff09;實驗一 開關控制LED的亮滅1.代碼部分2.運行結果 &#xff…

Qt | QFormLayout 類(表單布局)

01、上節回顧 Qt | QGridLayout 類(網格布局)02、簡介 1、QFormLayout 布局以兩列的形式列出其子項目, 2、QFormLayout 被分成兩列,左列是標簽(label)部分,通常由標簽 QLabel 組成,右列是由 字段(field)部分,通常是 QLineEdit 行編輯器,QSpinBox 旋轉框等部件,注意:…

【簡單易用,新人友好】一個輕量級生物信息學流程框架,從此解決99%的生物信息學流程搭建問題...

生物信息學數據分析流程的搭建是一項繁重而復雜的工作。隨著行業的發展&#xff0c;各種生信流程框架層出不窮&#xff0c;比如有: NextflowSnakemakeCWLWDL 各種標準&#xff0c;各種規則&#xff0c;令人眼花繚亂。選擇太多&#xff0c;往往令人無所適從。特別是新進入行業的…

小程序的深層了解

一:wxss的全局樣式和局部樣式 寫在文件上,第一個路徑會執行全局和局部自帶的wxss給wxml,會執行wxml,會執行json和js. 無論那個文件都會執行文件夾內的和外部的app.wxss,但是如果有一樣的屬性,則看屬性的權重,權重一樣,則設置局部樣式. 二:全局配置 wx:key"寫的是data內…

17.7K星開源產品分析平臺:Posthog

Posthog&#xff1a;開源洞察&#xff0c;產品優化的得力助手 - 精選真開源&#xff0c;釋放新價值。 概覽 PostHog是一個全面開源的平臺&#xff0c;旨在幫助團隊構建更好的產品。它提供了從產品分析到會話回放、功能標志和A/B測試等一系列工具&#xff0c;支持自托管&#x…

如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件

目錄 如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件1. 修改主配置文件 nginx.conf2. 在 conf.d 目錄中創建站點配置3. 設置站點根目錄和權限4. 檢查配置并重新加載Nginx總結 如何通過Nginx配置將請求轉發到conf.d目錄下的各個配置文件 在使用Nginx進行網站管理時&…

讀人工智能時代與人類未來筆記14_管控人工智能

1. 管控人工智能 1.1. 歷史上的戰場進一步推進到與數字網絡相連的所有地方 1.2. 數字程序現在控制著一個由眾多實體系統構成的龐大且仍在不斷增長的領域&#xff0c;而且越來越多的此類系統已實現網絡化 1.2.1. 在某些情況下甚至連門鎖和冰箱都實現了網絡化 1.2.2. 這催生出…

拋出異常時仍然需要記錄錯誤日志

場景&#xff1a;當service的方法執行拋出異常時&#xff0c;事務會發生回滾&#xff0c;導致無法記錄錯誤日志 解決&#xff1a;切面 其他&#xff1a;1.日志需要記錄日志標題&#xff0c;保存入參 2.失敗時會拋出異常&#xff1b;日志需要判斷執行是否成功&#xff0c;記錄…

2024年漢字小達人活動4個多月開賽:18道歷年選擇題和答案、解析

根據近年的安排&#xff0c;2024年第11屆漢字小達人比賽還有4個多月就啟動&#xff0c;那么孩子們如何利用這段時間有條不紊地備考呢&#xff1f;我的建議是兩手準備&#xff1a;①把小學1-5年級的語文課本上的知識點熟悉&#xff0c;重點是字、詞、成語、古詩。②把歷年真題刷…

聯想端游聯運SDK接入指南

1. 接入流程 本文檔主要介紹了 聯想PC游戲SDK接入流程、聯想游戲提供的功能、接入注意事項等。 1.1. 接入方式 1. 聯想游戲SDK2.1版本支持“賬號防沉迷支付”接入方式&#xff1b; a. 聯想提供賬號注冊、登錄等能力 b. 聯想提供防沉迷服務 c. 聯想提供游戲內支付 1.2. 對…

【學習筆記】計算機組成原理(八)

CPU 的結構和功能 文章目錄 CPU 的結構和功能8.1 CPU的結構8.1.1 CPU的功能8.1.2 CPU結構框圖8.1.3 CPU的寄存器8.1.4 控制單元CU和中斷系統 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的數據流 8.3 指令流水8.3.1 指令流水原理8.3.2 影響流水線性能的因素8.3.3 流水…

meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能對比測試

本文會使用如下兩個項目&#xff1a;meinheld-gunicorn-flask 與 uvicorn-gunicorn-fastapi 前文有測過 Flask vs FastApi 性能對比測試&#xff0c;可能不夠有說服力&#xff0c;這次使用了號稱最快的wsgi或asgi服務器gunicorn來運行flask或fastapi。 上面meinheld-gunicorn…