C/C++嵌入式開發環境搭建,Qt交叉編譯,cmake交叉編譯,clion/vscode遠程開發

目錄

  • 交叉編譯簡介
  • cmake 交叉編譯
  • clion 交叉編譯
  • vscode 遠程嵌入式開發
  • Qt交叉編譯
    • 1.安裝交叉編譯工具
    • 2.交叉編譯qt庫
    • 3.將交叉編譯的Qt庫復制到板子上
    • 4.安裝和配置 Qt Creator,支持交叉編譯
    • 5.QT嵌入式開發
    • 6.QT嵌入式開發報錯解決
      • QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
      • cannot execute binary file: Exec format error
      • arm上報錯找不到槽函數
  • 交叉編譯gdb調試
    • 交叉編譯 gdbserver
    • gdb遠程調試
    • gdb調試core文件

交叉編譯簡介

交叉編譯是在一個平臺上編譯生成另一個平臺上的可執行代碼,當我們開發目標是一個嵌入式設備時,便需要在PC機上編譯出能在該嵌入式設備上運行的可執行文件,這里編譯主機與目標運行主機不是同一個設備,該過程就稱為交叉編譯;
編譯是指一個源代碼文件,如C/C++文件要經過預處理(preprocessing)、編譯(compilation)、匯編(assembly)和鏈接(linking)等步驟才能變成可執行文件,整個過程統稱為編譯。

常用的交叉編譯環境是:在X86架構主機上編譯生成可執行文件,放到ARM架構開發板上運行。
為什么需要交叉編譯:目的平臺上不允許或不能夠安裝所需的編譯器;或目的平臺上的資源貧乏,無法運行我們所需要編譯器;或目的平臺還沒有建立,甚至沒有操作系統等。

cmake 交叉編譯

C/C++項目,可以使用cmake交叉編譯。

使用cmake創建嵌入式開發項目,和創建普通的C/C++項目類似,區別在于不使用默認的gcc/g++編譯器,而是使用交叉編譯器。

cmake創建C/C++項目參考:https://blog.csdn.net/weixin_40355471/article/details/133200612?spm=1001.2014.3001.5502

1、創建普通cmake項目,包含CMakeLists.txt文件

mkdir build	#在CMakeLists.txt所在目錄創建build文件夾
cd build	
vim rvgcc.cmake	#在build/目錄創建rvgcc.cmake文件,手動指定交叉編譯器路徑。set(CMAKE_C_COMPILER /opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-g++)
set(CMAKE_ASM_COMPILER /opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-gcc)set(CMAKE_C_COMPILER_FORCED TRUE)
set(CMAKE_CXX_COMPILER_FORCED TRUE)

2、cmake,使用 -DCMAKE_TOOLCHAIN_FILE 選項指定工具鏈文件的路徑
后面也可以帶上其他自定義選項 -DUBUSYS=ON

cmake -DCMAKE_TOOLCHAIN_FILE="rvgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug -DUBUSYS=ON ..

3、交叉編譯,生成可執行文件,拷貝到arm上運行

make -j

報錯處理
unknown value ‘native’ for ‘-march’
刪掉CMakeLists.txt文件中的-march=native
-march=native #march:指定目標架構名;native:允許編譯器自動探測目標架構

clion 交叉編譯

cmake創建項目后,可以使用傳統的 clion 進行遠程開發和交叉編譯。

clion 可運行在windows系統,編譯環境在 ubuntu20.04,交叉編譯后在 arm 上運行(clion 遠程開發,代碼在windows和ubuntu都有,修改后clion會上傳或下載進行代碼同步)。

使用 clion 遠程 linux 嵌入式開發,可以交叉編譯,但交叉編譯的可執行文件不能在clion運行和調試。

clion 遠程開發配置參考:https://blog.csdn.net/weixin_40355471/article/details/127833119?spm=1001.2014.3001.5502

clion 加載 CMakeLists.txt 文件后,在 CMakeLists.txt 所在目錄生成文件夾 cmake-build-debug ,把上面的 rvgcc.cmake 文件拷貝到該文件夾。

clion 交叉編譯設置:
1、clion–Settings–Toolchains–選擇創建的遠程連接,C Comoiler 手動錄入交叉編譯器目錄:/opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-gcc
C++ Comoiler 手動錄入交叉編譯器目錄:/opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-g++
其他設置不變,CMake和Debugger均是自動檢出。

2、clion–Settings–CMake–CMake options: 輸入編譯選項:

-DCMAKE_TOOLCHAIN_FILE="rvgcc.cmake" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=debug -DUBUSYS=ON .

完成設置后,在clion編譯即可生成可執行文件,拷貝到arm上運行。

vscode 遠程嵌入式開發

嵌入式開發使用 clion 只能交叉編譯,不能使用 clion 直接運行和調試交叉編譯的可執行文件,如果想簡單一點可以直接使用 vscode 遠程開發編輯,命令行遠程進行交叉編譯。

Qt交叉編譯

Qt交叉編譯,在arm板上運行(比如RK3399)。
環境搭建
主機:win10
開發環境:虛擬機,ubuntu 20.04.2
Qt交叉編譯庫版本:Qt5.12.9
Qt開發版本:Qt5.14.1
arm板:RK3399

大致思路
1、要讓程序在arm上運行,需要特殊的編譯器,首先在ubuntu上安裝這種編譯器(交叉編譯工具)。
2、ubuntu上,使用交叉編譯工具,把QT源碼編譯成可以在arm上使用的QT依賴庫。
3、編譯好的QT依賴庫拷貝到arm板子上,arm上可以執行QT交叉編譯的程序。
4、ubuntu安裝普通版本QT,配置構建套件,編譯器使用交叉編譯工具,QT版本配置交叉編譯好的qmake路徑。
5、至此可使用ubuntu的QT開發和交叉編譯,編譯的可執行文件拷貝到arm上運行。

硬件環境
RK3399 arm開發板通過USB轉串口與win10主機相連,識別COM口,win10主機通過COM口使用MobaXterm等遠程工具連接板子,給板子配置IP和網關后可以通過IP地址遠程,使用SCP進行文件傳輸。

#一些常用命令
vi  /etc/eth0-setting	#改網卡IPifconfig eth2 down
ifconfig eth2 192.168.72.167 up
ifconfig eth2  192.168.72.165  netmask 255.255.255.0

1.安裝交叉編譯工具

下載地址:https://www.linaro.org/downloads/
下載壓縮包:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz。

#拷貝到/opt目錄下
cd /opt
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz
sudo mv gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu gcc-aarch64-linux-gnu
sudo vim /etc/profile
export PATH="/opt/gcc-aarch64-linux-gnu/bin:$PATH"
source  /etc/profile
aarch64-none-linux-gnu-gcc -v

安裝完成后獲得交叉編譯器(/opt/gcc-aarch64-linux-gnu/bin 目錄下),配置環境變量后可以使用交叉編譯命令,和直接使用gcc類似。

#查詢版本,如果查詢到版本信息則說明安裝成功
aarch64-none-linux-gnu-gcc -v

交叉編譯qt庫時需要配置這個編譯器,后續也要配置到Qt Creator的構建套件里。

2.交叉編譯qt庫

下載Qt5.12.9源碼:https://download.qt.io/archive/qt/5.12/5.12.9/single/
下載版本:qt-everywhere-src-5.12.9.tar.xz
解壓縮源碼:

tar -xvf qt-everywhere-src-5.12.9.tar.xz
cd qt-everywhere-src-5.12.9/

2.1修改qmake.conf

vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
#
# qmake configuration for building with arm-linux-gnueabi-g++
#MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib#添加
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -ltsinclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
# 修改交叉編譯工具可執行文件
QMAKE_CC                = aarch64-none-linux-gnu-gcc
QMAKE_CXX               = aarch64-none-linux-gnu-g++
QMAKE_LINK              = aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB        = aarch64-none-linux-gnu-g++# modifications to linux.conf
QMAKE_AR                = aarch64-none-linux-gnu-ar cqs
QMAKE_OBJCOPY           = aarch64-none-linux-gnu-objcopy
QMAKE_NM                = aarch64-none-linux-gnu-nm -P
QMAKE_STRIP             = aarch64-none-linux-gnu-strip
load(qt_config)

2.2創建交叉編譯自動配置腳本,開始編譯
-prefix /opt/qt5.12.9-arm,配置生成的依賴庫保存路徑。

vim auto.sh
#!/bin/sh
./configure \
-prefix /opt/qt5.12.9-arm \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-separate-debug-info \sudo chmod u+x auto.sh 
./auto.sh
sudo make		#如果找不到 aarch64-none-linux-gnu-gcc 命令,可以切換到root下,不使用sudo
sudo make install
cd /opt/qt5.12.9-arm	#已安裝到指定目錄,查看(bin  doc  include  lib  mkspecs  plugins  qml  translations)

編譯完成后獲得交叉編譯所依賴的Qt庫(/opt/qt5.12.9-arm 目錄下),編譯好的庫要拷貝到arm板子上,后續也要配置到Qt Creator的構建套件里。

錯誤處理
python: not found

type python python2 python3
#如果沒有python,則安裝
sudo apt install python3
#如果有 python3 ,沒有 python,執行
sudo apt install python-is-python3

3.將交叉編譯的Qt庫復制到板子上

/opt/qt5.12.9-arm,把該目錄拷貝到arm板子上,在arm上配置環境變量。
從ubuntu把QT依賴庫拷貝到arm上。

scp -r qt5.12.9-arm root@192.168.72.165:/opt

在arm上執行,配置環境變量。

vi /etc/profile
export QTEDIR=/opt/qt5.12.9-arm
export LD_LIBRARY_PATH=/opt/qt5.9.0-arm/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FONTDIR=/usr/share/fonts/truetype/droid

4.安裝和配置 Qt Creator,支持交叉編譯

ubuntu上安裝普通版本的QT,比如5.14.1,可以只安裝Qt Creator,安裝完成后運行。

構建套件配置
添加C/C++編譯器
菜單欄,Tools,Options,Kits,Compilers,選擇添加,ADD,GCC,C/C++。
Manual,C,GCC,Complier path:/opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-gcc
Manual,C++,GCC,Complier path:/opt/gcc-aarch64-linux-gnu/bin/aarch64-none-linux-gnu-g++

添加Qt版本
Qt Versions,Add…,選擇交叉編譯生成的qmake目錄
Manual,Qt5.12.9(qt5.12.9-arm),/opt/qt5.12.9-arm/bin/qmake

添加構建套件
Kits,Add
Manual,生成自定義套件,包括名稱、設備類型、編譯工具、Qt版本等信息。
Name arm
Device Generic Linux Device
Compiler C: GCC
Compiler C++: GCC
Debugger System GDB at /usr/bin/gdb
Qt Version Qt5.12.9(qt5.12.9-arm)
CMake Tool System CMake at /usr/bin/cmake

5.QT嵌入式開發

新建QT項目,在選擇構建套件時,選剛剛新建的arm,正常開發編譯,把編譯好的二進制可執行文件拷貝到3399板子上。

scp hellowd  root@192.168.72.165:/userdata/qt_pro
./hellowd	#板子上運行

6.QT嵌入式開發報錯解決

QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed

在板子上運行時報錯,原因是缺少iconv庫。
下載源碼:http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz
下載:libiconv-1.14.tar.gz

tar xvf libiconv-1.14.tar.gz
cd libiconv-1.14/# 創建自動配置腳本
vim autoconfig.sh
./configure \
#替換交叉編譯器路徑
CC=/opt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc \
CXX=/opt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++ \
#安裝目錄
--prefix=/opt/libiconv_install/ \
--host=arm-linux \
--enable-shared \
--enable-static \
#當前解壓縮路徑
--with-sysroot=/home/chw/arm/libiconv-1.14chmod +x autoconfig.sh
./autoconfig.sh
make -j	#編譯
make install

‘gets’ undeclared here (not in a function); did you mean ‘fgets’? 報錯解決

vim srclib/stdio.in.h_GL_WARN_ON_USE (gets, “gets is a security hole-use fgets instead”)
# 修改為:
#if defined(GLIBC) && !defined(UCLIBC) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”);
#endif

安裝完成后,生成的庫文件路徑:/opt/libiconv_install。

# 拷貝到板子上
sudo scp -r libiconv_install/ root@192.168.72.111:/opt	
# 在板子上執行后,運行qt交叉編譯的可執行文件即可
export LD_PRELOAD=/opt/libiconv_install/lib/preloadable_libiconv.so	

cannot execute binary file: Exec format error

在板子上運行時報錯。
可能的原因:使用64位交叉編譯器編譯的可執行文件,放在32位arm上運行。
解決方法:更換交叉編譯器。

arm上報錯找不到槽函數

不使用SIGNAL(readyRead())寫法,改為&QSerialPort::readyRead這種寫法。

交叉編譯gdb調試

本章介紹遠程gdb調試方法:交叉編譯調試時,主機ubuntu使用gdb,arm使用gdbserver。

交叉編譯器自帶gdb,一般不需要編譯,例如:arm-linux-gnueabihf-gdb

arm-linux-gnueabihf-gdb --version	#查詢gdb版本

交叉編譯 gdbserver

下載gdb源碼:https://www.sourceware.org/gdb/download/
gdb-8.3.tar.gz,拷貝到ubuntu目錄

tar zxvf gdb-8.3.tar.gz
cd gdb-8.3/gdb/gdbserver/
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf  --prefix=/opt/gdb/gdbserver-lib
# --host:該軟件將運行的平臺,填你的交叉編譯器
# --target:該軟件所處理的目標平臺,填你的交叉編譯器
# --prefix:目標文件生成路徑
make
sudo make installcd /opt/gdb/gdbserver-lib/bin/	#生成的gdbserver目錄:arm-linux-gnueabihf-gdbserver
#把gdbserver拷貝到arm上
sudo scp arm-linux-gnueabihf-gdbserver root@192.168.72.111:/home/chw

gdb遠程調試

arm上執行

#1234是指定的端口號,qt_at3399是可執行程序,此時程序并未運行
./arm-linux-gnueabihf-gdbserver :1234 qt_at3399		
Process /home/chw/qt_at3399 created; pid = 2652
Listening on port 1234

ubuntu上執行

arm-linux-gnueabihf-gdb qt_at3399
#進入gdb
target remote 192.168.72.111:1234	#arm :Remote debugging from host ::ffff:192.168.72.55, port 56972
b 50	#在main.cpp的50行打斷點
c		#運行
#Thread 1 "qt_at3399" hit Breakpoint 1,命中第一個斷點
q		#退出gdb

在gdb遠程調試時,arm只負責 gdbserver 啟動遠程端口,指定可執行程序;程序的運行由 ubuntu 的gdb負責啟動、打斷點、調試、關閉等。

error while loading shared libraries: libncursesw.so.5

sudo apt install libncursesw5-dev
ln -s /usr/lib/libncursesw.so.6 /usr/lib/libncursesw.so.5
#不行再運行
sudo apt install apt-file
sudo apt-file update
sudo apt-file find libncursesw.so.5
sudo apt install libncursesw5

gdb調試core文件

ulimit -c unlimited	#arm上執行
#運行程序生成core文件
#把core文件拷貝到ubuntu主機
arm-linux-gnueabihf-gdb qt_at3399 core
bt	#查詢調用棧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717665.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717665.shtml

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

相關文章

ASUS華碩天選5筆記本電腦FX607JV原裝出廠Win11系統下載

ASUS TUF Gaming F16 FX607JV天選五原廠Windows11系統 適用型號: FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下載鏈接:https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取碼:0d46 原廠系統自帶所有驅動、…

TypeScript中 “ <> “ 語法 和 “ : “ 怎么使用

在 TypeScript 中&#xff0c;尖括號語法(<Type>)和as關鍵字(value as Type)都是用于類型斷言&#xff0c;而冒號(:)用于類型注解。這三種語法在不同的場景下使用&#xff1a; 尖括號語法和as關鍵字&#xff1a; 尖括號語法(<Type>value)&#xff1a; 這種語法在…

[LeetBook]【學習日記】鏈表反轉

來源于「Krahets」的《圖解算法數據結構》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 鏈表反轉的遞歸要點 遞歸終止條件為當前節點為空&#xff0c;表明遍歷到了鏈表尾部遞歸函數傳入參數為當前節點的下一個節點按照是否重新開辟存儲空間分類下面只寫…

python自動化學習--3.8python操作EXCEL文件python日志收集處理

1、Excel文件處理 安裝 openpxl 第三方庫 openpxl 模塊三大組件: 1、工作簿 &#xff08;包含多個sheet工作表&#xff09; 2、工作表 &#xff08;某個數據包含在某個工作表&#xff09; 3、單元格 1、創建excel工作簿 import openpyxl"""Excel表格的創建…

【簡說八股】Spring事務失效可能是哪些原因?

Spring事務介紹 Spring事務是指在Spring框架中對數據庫操作進行管理的一種機制&#xff0c;它確保一組數據庫操作要么完全執行成功&#xff08;提交&#xff09;&#xff0c;要么完全不執行&#xff08;回滾&#xff09;&#xff0c;從而保持數據一致性和完整性。 Spring框架…

GotoXy控制臺光標的位置更新

光標控制解釋 控制臺的光標更新方法, 用于控制數據輸出位置 void gotoXY(int x, int y)//新函數&#xff1a;更新光標 {COORD c;c.X x;c.Y y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }代碼解釋 這段代碼定義了一個名為 gotoXY 的函數&#xff0c;…

設計模式-裝飾者模式應用實踐

裝飾者模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許動態地向一個現有的對象添加新的功能&#xff0c;同時不改變其結構。這種模式通過創建一個裝飾類來包裝原有的類&#xff0c;提供額外的行為。 下面是一個使用 Java 實現裝飾者模式…

【Spring Boot】實現全局異常處理

1.定義基礎異常接口類 /*** description: 服務接口類* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 錯誤碼* return*/String getResultCode();/*** 錯誤描述* return*/String getResultMsg(); } 2.定義錯誤處理枚舉類 /*** desc…

小伙伴詢問AI該怎么學習?本人的一點總結,以思維導圖呈現

如有需要思維導圖的在后臺請留郵箱&#xff0c;相關知識結構目錄 部分導圖

nn.Linear() 使用提醒

原本以為它是和nn.Conv2d()一樣&#xff0c;就看第二個維度的數值&#xff0c;今天才知道&#xff0c;它是只看最后一個維度的數值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

git使用merge命令把dev分支的mian.js文件和src下面的vuex文件夾以及config文件夾單獨合并到master分支上

使用 git merge 命令來單獨合并特定文件或文件夾到另一個分支通常不是最直接的方法&#xff0c;因為 merge 命令是用來合并兩個分支的所有更改的。然而&#xff0c;你可以通過 git cherry-pick 命令或者通過創建臨時補丁&#xff08;patch&#xff09;來實現這一點。 下面是一個…

秒殺的時候怎么使用Redis?

商品信息存儲&#xff1a;在Redis中存儲秒殺商品的庫存信息。可以使用Redis的Hash數據類型&#xff0c;將商品ID作為字段&#xff0c;庫存數量作為值存儲在Hash中。例如&#xff0c;HSET seckill_goods stock_1 100表示商品ID為stock_1的商品庫存數量為100。 秒殺訂單存儲&…

如何使用“Ubuntu 20.04桌面版,安裝MariaDB數據庫“?win10系統?

1、更新軟件包 sudo apt update 2、 安裝MariaDB服務器和客戶端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否運行 service mysql status :q"退回命令行狀態 4、 設置MariaDB root用戶的密碼 sudo mysql_secure_installation 5、 MariaD…

斐波那契數列模型----三步問題

面試題 08.01. 三步問題 - 力扣&#xff08;LeetCode&#xff09; 1、狀態表示&#xff1a; 題目要求&#xff1a;上到n階臺階&#xff0c;有多少種方法。那么n逐漸簡化&#xff0c;上1階臺階有多少種方法&#xff1b;上2階臺階有多少種方法……直到上n階臺階有多少種方法。 …

c++ [[nodiscard]]關鍵字詳解

如果一個函數聲明了[[nodiscard]]&#xff0c;則該函數的返回值不能沒有承接&#xff0c;如果沒有承接&#xff0c;就會編譯報warning [[nodiscard]]是c17新特性&#xff0c;但本地用c11標準編譯也能編譯過&#xff0c;尚不清楚原因&#xff0c;c20加入了warning后的額外文字描…

代碼隨想錄第45天|● 70. 爬樓梯 (進階) ● 322. 零錢兌換 ● 279.完全平方數

文章目錄 ● 70. 爬樓梯 &#xff08;進階&#xff09;思路&#xff1a;- 排列 先value后weight代碼&#xff1a; ● 322. 零錢兌換思路&#xff1a;代碼 ● 279.完全平方數思路&#xff1a;代碼 ● 70. 爬樓梯 &#xff08;進階&#xff09; 思路&#xff1a;- 排列 先value后…

如何提升計算機性能

04 穿越功耗墻&#xff0c;我們該從哪些方面提升“性能”&#xff1f; 上一講&#xff0c;在講 CPU 的性能時&#xff0c;我們提到了這樣一個公式&#xff1a; 程序的 CPU 執行時間 指令數CPIClock Cycle Time 這么來看&#xff0c;如果要提升計算機的性能&#xff0c;我們可以…

zookeeper框架

事務ID Znode的創建刪除&#xff0c;更改內容等都是作為zookeeper的事務進行執行的。 對于每一個事務請求&#xff0c;zookeeper都會為其分配一個全局唯一的事務ID&#xff0c;從ID可以識別出事務的全局順序。 節點特性 czxid:create zxid,數據節點創建時的事務ID mzxid&…

基于ZYNQ的PCIE高速數據采集卡的設計(一)

作為信息處理的第一步&#xff0c;數據采集的作用越來越重要。目前&#xff0c;數據采集已經在航 空、民用、軍事、醫療等領域得到廣泛應用。隨著相關技術的不斷發展&#xff0c;信號頻率越 來高&#xff0c;帶寬越來越大&#xff0c;使得數據采集技術逐漸向高速大數據的方向…

【python】優化docker鏡像體積

背景 測試腳本的最終所構成的鏡像體積偏大&#xff0c;項目提出整改 實現思路 1.測試基礎鏡像&#xff0c;更換為更小的 參見&#xff1a;python 多階段構建docker鏡像&#xff0c;有效減少鏡像大小 - 知乎 2.去掉實際未使用的依賴庫