嵌入式學習筆記DAY43(ARM架構)

一、RAM分類

sram(靜態隨機存取存儲器):

  • 原理:使用晶體管來存儲二進制數據0和1,通過雙穩態電路(由多個晶體管組成)來保持數據狀態,只要持續供電,數據就能穩定保存。
  • 數據讀寫速度非常快
  • 成本高,因為每個存儲單元需要多個晶體管構成,所以集成度相對較低,芯片面積較大,導致成本較高。
  • 存儲密度低:由于每個存儲單元占用較多的晶體管和芯片面積,所以在相同的芯片面積下,能容納的存儲單元數量相對較少,即存儲密度低。

dram(動態隨機存取存儲器):

  • 原理:利用電容的充放電來存儲數據,電容充滿電表示 1,放電后表示 0 。但由于電容存在漏電現象,所以數據不能長時間保持,需要定期進行刷新操作來維持數據的正確性。
  • 功耗大:一方面,刷新操作需要額外的能量消耗;另一方面,DRAM 的讀寫操作也需要一定的功耗,所以整體功耗相對較大。
  • 需外接刷新電路:為了保證數據的正確性,需要外部電路定期對存儲電容進行刷新,以補充因漏電而損失的電荷。
  • 讀寫速度低于 SRAM:由于存在刷新操作以及電容充放電的延遲等因素,其讀寫速度比 SRAM 慢。
  • 成本低,存儲密度大:每個存儲單元只需要一個晶體管和一個電容,在相同的芯片面積下可以集成更多的存儲單元,存儲密度大,同時成本相對較低,因此常用于計算機的主內存等對容量需求較大的場景。

sdram(同步動態隨機存取存儲器):

  • 原理:本質上還是基于 DRAM 的電容充放電原理來存儲數據,但在此基礎上增加了同步電路。
  • 增加同步電路:SDRAM 通過與系統時鐘信號同步,使得數據的讀寫操作能夠與系統時鐘精確配合。這樣可以更有效地控制數據的傳輸時間,提高了數據傳輸的效率和準確性。
  • 提高數據讀寫速度:相比于普通的 DRAM,由于同步電路的存在,數據的讀寫操作更加有序和高效,從而提高了數據的讀寫速度,能夠更好地滿足計算機系統對內存讀寫速度不斷提高的需求

ddr ram(雙倍數據速率同步動態隨機存取存儲器):

  • 原理:基于 SDRAM,在時鐘信號的上升沿和下降沿都能進行數據傳輸,實現了雙倍的數據傳輸速率。
  • 雙倍數據速率:在相同的時鐘頻率下,DDR RAM 的數據傳輸量是 SDRAM 的兩倍。

iram(內部隨機存取存儲器):

  • 本質:IRAM 并非是一種獨立于其他類型的全新 RAM,通常情況下,IRAM 就是 SRAM。
  • 應用場景:它通常存在于 SoC(System on a Chip,片上系統)內部。因為其速度快的特點,在 SoC 中用于存儲對訪問速度要求較高的數據。

二、ROM的分類?

?

?三、數據和指令類型

?

Thumb是一般在安卓下使用;

大小端在ARM中可以被設置,一般是小端;

四、ARM處理器工作模式?

?

User(用戶模式):

  • 非特權模式。意味著在此模式下運行的程序對系統資源的訪問受到限制,不能隨意訪問敏感資源或執行特權指令。

FIQ(快速中斷模式):

  • 當一個高優先級的快速中斷產生時,處理器會進入此模式。快速中斷通常用于處理對響應時間要求極高的事件,例如某些實時性很強的硬件設備(如高速數據采集設備)產生的中斷請求。
  • 該模式擁有獨立的一組寄存器(相較于其他模式),使得在處理快速中斷時可以減少寄存器切換的開銷,加快中斷處理速度,能快速響應并處理緊急且重要的事件。

IRQ(普通中斷模式):

  • 當一個低優先級的普通中斷產生時,處理器進入此模式。普通中斷涵蓋了大量常見的設備中斷請求,比如鍵盤、鼠標等外設的中斷。
  • 與 FIQ 對比:相比 FIQ,IRQ 的優先級較低,且沒有像 FIQ 那樣專門優化的寄存器組,處理速度相對較慢,但能滿足大多數普通外設中斷的處理需求。

Supervisor(超級用戶模式):

  • 進入方式:當處理器復位(例如系統開機啟動)時,或者執行軟中斷指令(如 ARM 架構中的 SWI 指令,用于從用戶模式切換到特權模式并請求系統服務 )時,會進入該模式。
  • 此模式屬于特權模式,擁有較高權限,可以訪問系統的所有資源,主要用于操作系統內核及一些關鍵的系統管理功能,比如內存管理、進程調度等。

Abort(異常中止模式):

  • 當處理器在進行內存存取操作時發生異常,例如訪問了無效的內存地址、違反了內存訪問權限(如試圖寫入只讀內存區域)等情況,就會進入 Abort 模式。或者硬件本身就由問題。
  • 在該模式下,操作系統或相關軟件可以進行錯誤處理,比如記錄錯誤信息、嘗試恢復系統狀態等,以保證系統在遇到存取異常時不至于崩潰。

Undef(未定義指令模式):

  • 觸發條件:當處理器遇到無法識別或未定義的指令時,會進入此模式。這可能是由于軟件錯誤(如程序代碼損壞、錯誤的指令編寫 )或者硬件故障導致指令譯碼錯誤等原因引起的。
  • 處理方式:在 Undef 模式下,通常會執行相應的錯誤處理程序,如向用戶報告錯誤、嘗試修復或終止出現問題的程序,以維護系統的穩定性。

System(系統模式):

  • 特性:使用和 User 模式相同的寄存器集,但它是一種特權模式。這意味著它在擁有 User 模式寄存器配置的同時,還具備特權模式的權限,可以訪問系統的所有資源。

ARM9有7種工作模式,對于我們要學習的cortex-7還包括以下兩種:

cortex-A特有模式:

monitor監視模式:

  • 它主要用于執行安全監控代碼,比如實現安全啟動、安全固件更新、監控系統中安全相關事件等功能。

?在編寫程序之前,將工作模式從supervisor切換至user

?包括打開icahe,關閉dcache,關閉mmu

?五、寄存器組織概要

1.寄存器組織

?

說明:

  • 圖中框起來的寄存器表示不同的工作模式所特有的
  • 要給每一個模式開辟不同的內存空間去管理不同的棧
  • 所有的模式共用一個PC
  • user模式下沒有SPSR(保存當前狀態寄存器),因為在異常發生時,對于user模式來說,處理器會切換到相應的異常模式去處理異常,比如發生 IRQ 中斷時,處理器進入 IRQ 模式,并把 User 模式下的 CPSR 保存到 SPSR_irq 中。在異常處理完成后,再從對應的 SPSR 恢復到 CPSR,回到 User 模式繼續執行程序。這就意味著 User 模式下的程序狀態可以在其他異常模式的 SPSR 中得到保存和恢復,不需要專門為 User 模式設置一個 SPSR。
  • system模式使用user模式寄存器集
  • SP應該被提前設置,防止切換至不同模式之后棧的內容被覆蓋

2. 寄存器個數?

?

3. 程序狀態寄存器?

六、異常處理

ARM除了有模式概念,對外界也會產生一些中斷

不是只有中斷才可以打破當前工作狀態,下面為不同的異常類型:

Reset(復位異常)

Undefined instruction(未定義指令異常)

  • 當處理器遇到無法識別、譯碼的指令時觸發。可能是由于軟件錯誤(如程序代碼損壞、編寫了不支持的指令)、硬件故障導致指令讀取或譯碼出錯等情況;

Software interrupt(軟中斷異常)

  • 并非硬件造成的,通過自己發送指令去打斷;
  • 多任務并發就是靠軟中斷;
  • 看一塊soc適不適合跑在操作系統上,就看能不能進行軟中斷異常,以及帶不帶MMU;

Prefetch Abort(預取中止異常):

  • 處理器在預取指令階段,發現內存訪問存在異常情況,如訪問了無效的內存地址、違反了內存訪問權限(試圖讀取不可讀區域)等,就會觸發該異常。

Data Abort(數據中止異常):

  • 當處理器在進行數據讀寫操作時,遇到內存訪問異常,如訪問了不存在的內存地址、沒有相應的數據訪問權限(如向只讀區域寫入數據)等情況時觸發。

說明:

  • 偏移量:彼此之間相差4字節,即它們都在同一片內存空間中;
  • 異常向量表:是一段連續的內存區域,存儲著不同類型異常對應的處理程序入口地址。當 ARM 處理器檢測到異常發生時,會根據異常的類型,迅速跳轉到異常向量表中對應的地址,進而執行相應的異常處理程序;
  • 后面在寫代碼時,PC一開始要指向0x00復位,所以第一步要將整個異常的存儲數組跳過去,進行初始化;
  • 中斷的中斷向量查出來之后,要趕緊切換至USER,才能讓其他的中斷進來;??

七、ARM匯編指令?

1. mov指令

? ? ?加載12位立即數到寄存器或轉移一個寄存器的值到另外一個寄存器;

  • MOV{S}<c> <Rd>, #<const>

eg:mov r0, #2 ;? ? ?加載立即數2到寄存器r0

  • MOV{S}<c> <Rd>, <Rm>

eg:mov r1, r0 ;? ? ?將r0寄存器的值加載到r1?

2. 對加載數據先做運算再存入?

ASR:算數右移

LSL:邏輯左移

LSR:邏輯右移

ROR:循環右移

eg:

  • mov r1, r0? lsl? #1? ? ? //表示將r0往r1放之前可以先對其進行運算,將r0先左移一位結果為2,將結果保存在r1中
  • mov r1, r0, lsl r2? ? ? ?//表示將r0中的結果左移r2位存放到r1中,但r0中的結果沒變

3.mvn指令?

eg: mvn r3, #1 ;1按位取反放入r3寄存器中,0xFFFFFFFE

表示把要裝入的數先按位取反之后再放入寄存器中,相當于走了兩步,提高了CPU速率

4.add指令 (求和)

add r1, r1, r0

add r0, r0, #1

5. sub指令 (減法)

SUB{S}<c> <Rd>, <Rn>, #<const>

SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

八、立即數?

#const? ? ?相當于匯編中的常量,但并非任意數均可作為立即數

1. 判斷立即數的三個條件

  • 如果某個數的數值范圍是0~0xFF之間,那么這個數一定是立即數;
  • 把某個數展開成2進制,這個數的最高位1至最低位1之間的二進制數序列的位數不能超過8位;
  • 這個數的二進制序列湊夠8位之后的的右邊必須為偶數個連續的?0

2. 舉例?

0x234 = 0000 0000 0000 0000 0000 0010 0011 0100

最高位1至最低位1之間的二進制數序列:1000 1101沒有超過8位

末尾1的右邊有2個0,所以0x234是立即數

0x3f4 = 0000 0000 0000 0000 0000 0011 1111 0100

最高位1至最低位1之間的二進制數序列:1111 1101 從第一個1開始到最后一個1之間沒有超過8位

末尾1的右邊有2個0,所以0x3f4是立即數

0x132 = 0000 0000 0000 0000 0000 0001 0011 0010

最高位1至最低位1之間的二進制數序列:1001 1001 從第一個1開始到最后一個1之間沒有超過8位

末尾1的右邊有1個0,不滿足第二條,所以0x132不是立即數

0x7f8 = 0000 0000 0000 0000 0000 0111 1111 1000

最高位1至最低位1之間的二進制數序列:1111 1111從第一個1開始到最后一個1之間沒有超過8位

末尾1的右邊有3個0,不滿足第二條,所以0x7f8不是立即數

0xfab4 = 0000 0000 0000 0000 1111 1010 1011 0100

最高位1至最低位1之間的二進制數序列:0011 1110 1010 1101 從第一個1開始到最后一個1之間超過8位,不滿足條件1,所以這個數不是立即數

3. 原因?

這是因為ARM中將這 12bits 分為 8bit 常數(0~255)和 4bit 循環右移位值(0~15)

8bit 常數范圍(0~255),位移的步進值是以2為單位(即實際位移 2 * rotate 位),可以表示循環有以(0~30)偶數位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30。在實際存儲這個數值的時候,要想辦法把這個數壓縮到這12位中去。壓縮的方法就是找一個數,這個數必須是一個8bit數,之后循環右移2 * rotate位。如果能找打這個數,那么待保存的數就是立即數,否則就不是。

九、其他指令(ldr、str、bic、orr等)?

1.ldr(寄存器加載指令)

偽指令,可以把任意一個目標數加載進去,并不在那12個比特里,等于用了代碼區中的一部分空間;

  • LDR{<c>}{<q>} <Rt>, <label> ;
  • 如ldr r0, =0x2FAB4
  • ldr指令多用于從ram中將一個32位的字數據傳送到目的寄存器中

?2. bic(指定位清零指令)

bic {S}<c> <Rd>, <Rn>, #<const>;

將rn中的字數據const為1的比特清零,把結果放入rd

eg:

? ? ? ? mov r0, 0xFFFFFFFF

? ? ? ? bic r0, ?r0, #3;立即數哪些位為1就清掉

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? r0數據:0xFFFFFFFC

? ? ? ? bic r0, r0, #(0x1F << 8);連續5位清0

3.str指令(寫入)?

str 用于將數據存入地址中:

如上圖中,將r1的內容,寫入r0+4的地址

4. orr指令(指定位置1)?

mov r0, #0

orr?r0,? r0, #5;立即數帶1的比特位置1

orr?r0, r0, #(1<< 9);第9位置1

十、{s}

? ? 加s的作用是讓它去影響CPSR

匯編指令的s后綴,幾乎所有的匯編指令都可以在指令后面加上s后綴,s后綴的含義是在指令執行過程中會更新cpsr寄存器的N,V,C,Z位

  • N:在結果是有符號的二進制補碼情況下,如果結果為負數,則N=1;如果結果為非負數,則N=0
  • Z:如果ALU運算結果為0,則Z=1;如果結果為非零,否則Z=0
  • C:是針對無符號數最高有效位向更高位進位時C=1;減法中運算結果的最高有效位從更高位借位時C=0
  • V:該位是針對有符號數的操作,會在下面兩種情形變為1,兩個最高有效位均為0的數相加,得到的結果最高有效位為1;兩個最高有效位均為1的數相加,得到的結果最高有效位為0;除了這兩種情況以外V位為0

例如:? ?mov r0, #0xFFFFFFFF

????????????? adds r1, r0, #1

? ? ? ?上面的操作會導致Z,C置位,這是因為結果為0,并且從無符號數角度來看,已經從最高位向更高位進位了

???????而

????????????? mov r0. #0x7FFFFFFF

?????? ?????? adds r1, r0, #1

? ? ? ?會造成N位和C位置位,這是因為計算結果0x80000000最為位為1,代表負數,并且 從有符號角度來看,把一個整數加成了負數。

更新N,V,C,Z位有什么用呢?幾乎所有的arm指令都可以在指令之后可選地增加執行條件

例如:movcs r0, #100;表示只有在C位置位的情況下才能把100加載入r0,這樣的話就可以非常方便地實現指令的有條件執行。

十一、指令(cmp、b)

?1.cmp指令

CMP比較指令用于比較兩個寄存器的值或者比較一個寄存器和立即數的值,其原理是對待比較的兩個數求差,看結果是否為0,這個指令會無條件修改N,V,C,Z位。

2. 跳轉指令?

b指令類似c語言的goto語句,能夠實現無條件跳轉。跳轉時需要一個lable,表示要跳轉到什么地方去 ;

指令b本質是往PC里填了一個數,?b loop 相當于 ldr pc, =loop

練習:

?

2. 找出三個數的最大值

cmp r0, r1
blt less
greatmov r2, r0b cmp1less?mov r3, r1cmp1cmp r3, r2bge finishedmov r3, r2

3. 實現從0到100的和?

4.填充數組到指定地址的空間

ldr r0, =0x40000000mov r1, #0mov r2, #1loopcmp r1, #10bge finishedstr r2, [r0], #4add r2, r2, #1add r1, r1, #1ldr pc, =loop ;b loopfinishedb finishedend

?

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

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

相關文章

2025國際無人機應用及防控大會四大技術專題深度解析

2025國際無人機應用及防控大會四大技術專題深度解析 2025國際無人機應用及防控大會四大技術專題深度解析1 無人機系統技術專題技術特點與應用領域國內領軍企業及案例風險挑戰與發展方向 2 測控與通信導航技術專題技術創新與應用突破領先企業及解決方案現存問題與發展趨勢 3 任務…

DD3118S:USB3.0+Type-c雙頭TF/SD二合一高速0TG多功能手機讀卡器ic

DD3118S封裝是QFN42, GL3224封裝是QFN32 &#xff0c;設計同樣一款3.0讀卡方案&#xff0c;GL3213S需要電容、電阻外圍器件一起要29顆&#xff0c;而DD3118S只需要13顆&#xff0c;方案精簡且設計簡單 DD3118S支持USB3.0Type-c雙頭TF/SD二合一 &#xff0c;高速0TG多功能手機讀…

如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄?

title: 如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方認證集成通過OAuth2.0授權碼流程實現,包含用戶跳轉GitHub認證、獲取授權碼、交換訪問令牌及調用API獲取用戶信息四…

深入JVM:從零到實戰,解鎖Java性能與調優的終極武器

“什么&#xff1f;你還在寫CRUD&#xff1f;面試官問個JVM調優直接啞火&#xff1f;線上服務OOM了只能重啟大法&#xff1f;” —— 別慌&#xff0c;掌握JVM&#xff0c;你也能成為團隊里的“定海神針”&#xff01; 作為一名Java開發者&#xff0c;無論你是剛入行的新人還是…

MyBatis 中的 resultType 與 resultMap:區別、使用場景及示例詳解

目錄 一、什么是 resultType 1. 定義 2. 特點 3. 使用場景 4. 示例 示例 1&#xff1a;返回一個實體類對象 對應的 Java 類&#xff1a; 示例 2&#xff1a;返回 Map 集合 返回的每個記錄是一個 Map&#xff0c;例如&#xff1a; 二、什么是 resultMap 1. 定義 2. …

Mac安裝Apache CXF的時候報錯:/Library/Internet: No such file or directory

該問題的原因因為配置的JAVA_HOME環境變量路徑中的包括空格字符導致的錯誤。 一、問題排查 輸出當前環境變量 $JAVA_HOME的路徑地址&#xff0c;觀察路徑中是否存在空格 echo $JAVA_HOME二、問題解決 將JAVA_HOME路徑改為你安裝的jdk路徑&#xff0c;注意你的版本號可能與我的會…

npm(或pnpm)時報:證書過期 certificate has expired問題

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 首先安裝pnpm npm install -g pnpm //檢查安裝成功的版本 pnpm -v 在拉芋道管理系統&#xff0c;安裝依賴pnpm i 時報證書過期 更改了鏡像也一樣 解決方案&#xff1a; 提示&#xff1a;這里填寫該…

回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型

回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型 目錄 回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 KAN作為這兩年最新提出的機制&#xff0c;目前很少人用&#xff0c;很適合作為預測的創新點&…

人生筆記Real:記錄生活點滴,守護珍貴記憶

在快節奏的現代生活中&#xff0c;我們常常會有一些瞬間的靈感、難忘的經歷或者需要記錄的重要事項。然而&#xff0c;如何高效地記錄這些內容&#xff0c;并確保它們不會隨著時間的流逝而丟失&#xff0c;成為了一個值得思考的問題。《人生筆記Real》正是這樣一款簡單好用的筆…

自動駕駛數據特征提取實戰:用Python打開智能駕駛的新視角

自動駕駛數據特征提取實戰:用Python打開智能駕駛的新視角 聊起自動駕駛,很多朋友第一時間想到的可能是“車上的攝像頭多牛,傳感器多先進”,但讓我告訴你,真正決定自動駕駛“大腦”能不能跑得順暢、跑得準的,是數據的“骨頭”—特征。 沒錯,機器學習、深度學習的基礎都…

從零搭建共享棋牌室物聯網系統:硬件選型與避坑指南!

近來&#xff0c;24小時共享棋牌室憑借“低成本、無人化、高坪效”的特點成為創業熱點。但許多項目在硬件選型階段就踩坑不斷——設備不兼容、安裝返工、售后無門等問題頻發。本文將結合實戰經驗&#xff0c;手把手教你從零搭建穩定可靠的棋牌室物聯網硬件系統&#xff0c;并附…

NPM 依賴包版本號 `~` 和 `^` 的區別及最佳實踐

本文將深入淺出地解釋 ~ 與 ^ 在 package.json 中的含義&#xff0c;并結合實際開發流程給出團隊協作與發布上線的最佳版本管理策略。 一、版本號的基本結構 NPM 依賴的版本號遵循 SemVer&#xff08;語義化版本&#xff09; 標準&#xff1a; 主版本號.次版本號.補丁號Major…

uniapp報錯Cannot read property ‘dataset‘ of null

如果你引入的組件在uniapp分包路徑中&#xff0c;就會報錯

服務器常見問題以及解決方案

以下是服務器常見問題及對應的維護解決方案&#xff0c;涵蓋硬件、網絡、軟件、安全等核心場景&#xff0c;基于最新行業實踐整理&#xff1a; 一、硬件層故障? 硬盤失效? 現象?&#xff1a;系統崩潰、IO錯誤、SMART告警。 解決?&#xff1a; 立即更換故障盤&#xff0c…

企業級 Java 應用灰度發布設計方案與實踐全解析

引言 在當今互聯網產品快速迭代的背景下&#xff0c;如何在保證服務穩定性的同時&#xff0c;快速驗證新功能的有效性&#xff0c;成為了技術團隊面臨的重要挑戰。灰度發布&#xff08;Canary Release&#xff09;作為一種重要的發布策略&#xff0c;能夠將新版本逐步推向部分用…

computed()、watch() 與 watchEffect()

下面&#xff0c;我們來系統的梳理關于 computed、watch 與 watchEffect 的基本知識點&#xff1a; 一、核心概念與響應式基礎 1.1 響應式依賴關系 Vue 的響應式系統基于 依賴收集 和 觸發更新 的機制&#xff1a; #mermaid-svg-twmGhASLw43mK8XM {font-family:"trebuch…

【Linux驅動開發 ---- 4.2_平臺設備(Platform Devices)概述】

Linux驅動開發 ---- 4.2_平臺設備&#xff08;Platform Devices&#xff09;概述 目錄 Linux驅動開發 ---- 4.2_平臺設備&#xff08;Platform Devices&#xff09;概述前述主要特點&#xff1a;平臺設備的作用平臺設備的注冊與注銷1. platform_device_register_simple()2. pla…

深入學習入門--(一)前備知識

一.Python基礎知識 1.1 Python算數運算 1.2 變量 1.3 數據類型 1.3.1 int&#xff08;整數&#xff09; float&#xff08;浮點數&#xff09; str&#xff08;字符串&#xff09; 1.3.2 bool&#xff08;布爾值&#xff09;: 表示真或假 取值:True,False 1.3.3 list&…

iClone 中創建的面部動畫導入 Daz 3D

以下是如何將 iClone 中創建的面部動畫導入 Daz 3D 的簡要指南。簡而言之&#xff0c;您可以通過 FBX&#xff08;使用 3DXchange 或 Character Creator 的導出工具&#xff09;導出 iClone 面部動畫&#xff0c;然后將其導入 Daz Studio 并將變形或骨骼重新映射到 Genesis 角色…

OceanBase向量檢索在貨拉拉的探索和實踐

貨拉拉成立于2013年&#xff0c;成長于粵港澳大灣區&#xff0c;是從事同城跨城貨運、企業版物流服務、搬家、零擔、跑腿、冷運、汽車租售及車后市場服務的互聯網物流商城。截至2024年&#xff0c;貨拉拉在全球擁有1670萬月活用戶和168萬月活司機&#xff0c;業務覆蓋全球11個市…