全志T153處理器ARM+RISC-V的雙核CP多有強?
在嵌入式設(shè)備拼性能、拼響應(yīng)、拼功耗的內(nèi)卷時代,雙核協(xié)作才是破局的關(guān)鍵
傳統(tǒng)的對稱多處理(SMP)架構(gòu)已難以兼顧全場景需求,非對稱多處理(AMP)異構(gòu)架構(gòu)正在成為行業(yè)主流
在這樣的背景下,全志T153平臺直接搬出ARM+RISC-V的"雙核CP":主打高性能計算的Cortex-A7核心運行Linux,聚焦高實時性任務(wù)的RISC-V E907核心運行RTOS,組成 "互補型搭檔"。
本文會通過飛凌嵌入式OK153-S開發(fā)板,為大家實測這對雙核CP的協(xié)作實力——依托異構(gòu)核間通訊機制(IPC)與Suspend/Resume電源管理機制,全面驗證A核與R核的協(xié)同工作能力,并驗證異構(gòu)多核環(huán)境下的數(shù)據(jù)交互效率與智能化喚醒邏輯。
1 休眠喚醒功能驗證
pm_test節(jié)點可以用于測試Linux部分的休眠喚醒功能。設(shè)備凍結(jié)后,等待5s,即返回,執(zhí)行喚醒動作。
# 設(shè)置pm_test模式 echo devices > /sys/power/pm_test # 設(shè)備進入休眠 echo mem > /sys/power/state # 執(zhí)行以上命令后,設(shè)備5s后會被喚醒。
2 R核喚醒休眠的A核
功耗管理是產(chǎn)品續(xù)航與成本控制的核心競爭力。T153處理器的異構(gòu)多核架構(gòu)為此提供了的解決方案:
- A核休眠:ARM核在空閑時進入WFI深度睡眠,功耗降至最低
- R核值守:RISC-V核心持續(xù)運行,監(jiān)聽外部事件
- 按需喚醒:當傳感器觸發(fā)、定時任務(wù)到達時,R核一鍵喚醒A核處理復雜任務(wù)
A核進入WFI模式,R核運行在DRAM上,R核喚醒A核
首先設(shè)置主核休眠時,DRAM不進入自刷新,從核保持運行在DRAM上??梢酝ㄟ^linux控制臺輸入以下命令切換:
echo 0 >/sys/class/pm_msgbox/set_dram_refresh
然后A核進入休眠狀態(tài):
echo mem > /sys/power/state
使用R核喚醒A核。我們的R核提供了cpux_resume接口來喚醒主核,在R核中執(zhí)行以下命令進行A核喚醒:
cpux_resume
在低功耗場景下,高性能的A核休眠待機,低功耗的R核持續(xù)值守。當外部事件觸發(fā)時,R核可瞬間喚醒A核響應(yīng)任務(wù)。這種"小核值班、大核待命"的架構(gòu),讓設(shè)備在續(xù)航與實時響應(yīng)之間達到平衡。
3 雙核通訊驗證
T153處理器采用ARM Cortex-A7+RISC-V的多核異構(gòu)架構(gòu),讓系統(tǒng)兼具"大腦"與"小腦",而異構(gòu)核間通訊機制(IPC)正是連接兩個"腦"的高速通道,通過共享內(nèi)存機制,雙核之間可實現(xiàn)數(shù)據(jù)傳輸。以下是操作方法:
# 測試之前首先使能R核: echo amp_rv0.bin > /sys/class/remoteproc/remoteproc0/firmware echo start > /sys/class/remoteproc/remoteproc0/state
RISC-V端例程
代碼路徑:rtos/lichee/rtos-components/aw/rpbuf/rpbuf_demo/rpbuf_test.c
static void print_help_msg(void)
{
printf("\n");
printf("USAGE:\n");
printf(" rpbuf_test [OPTIONS]\n");
printf("OPTIONS:\n");
printf(" -h : print help message\n");
printf(" -c : create buffer\n");
printf(" -C : Send Cnt(default: 1)\n");
printf(" -d : destory buffer\n");
printf(" -s : send test messagese\n");
printf(" -l : list created buffers\n");
printf(" -a : sync transmit\n");
printf(" -I ID : specify controller ID (default: 0)\n");
printf(" -N NAME : specify buffer name (default: \"%s\")\n", RPBUF_BUFFER_NAME_DEFAULT);
printf(" -L LENGTH : specify buffer length (default: %d bytes)\n", RPBUF_BUFFER_LENGTH_DEFAULT);
printf(" -p : print performance data\n");
printf("\n");
printf("e.g.\n");
printf(" First, create a buffer (its name and length should match that of remote rpbuf buffer):\n");
printf(" rpbuf_buffer -N \"xxx\" -L LENGTH -c\n");
printf(" Then if remote sends data to it, the buffer callback will be called.\n");
printf("\n");
printf(" We can send test data to remote:\n");
printf(" rpbuf_test -d 100 -s -L 32\n");
printf("\n");
printf(" If this buffer is no longer in use, destroy it:\n");
printf(" rpbuf_test -N \"xxx\" -d\n");
printf("\n");
}
參數(shù)說明
- -c創(chuàng)建緩沖區(qū)
- -C發(fā)送次數(shù)
- -d銷毀
- -i哪個節(jié)點
- -a數(shù)據(jù)同步
- -N名字
- -L緩沖區(qū)大小
A核例程
static void print_help_msg(void)
{
printf("\n");
printf("USAGE:\n");
printf(" rpbuf_test [OPTIONS]\n");
printf("\n");
printf("OPTIONS:\n");
printf(" -d time : set data sending interval (default: 100 ms)\n");
printf(" -s : send test messages\n");
printf(" -c : send count (default: 10)\n");
printf(" -r : receive messages\n");
printf(" -t time : specifies the time of receive messagess, unit:ms\n");
printf(" -a : sync transmit\n");
printf(" -I ID : specify rpbuf ctrl ID (default: 0)\n");
printf(" -N NAME : specify buffer name (default: \"%s\")\n", RPBUF_BUFFER_NAME_DEFAULT);
printf(" -L LENGTH : specify buffer length (default: %d bytes)\n", RPBUF_BUFFER_LENGTH_DEFAULT);
printf(" -p : print performance data\n");
printf("\n");
printf("e.g.\n");
printf(" rpbuf_test -L 0x1000 -c 10 -s : send 10 test data, size=0x1000\n");
printf(" rpbuf_test -L 0x1000 -r : receive test data forever, size=0x1000\n");
printf(" rpbuf_test -L 0x1000 -r -t 1000 : receive test data 1 second, size=0x1000\n");
printf("\n");
}
參數(shù)說明
- -s發(fā)送
- -c發(fā)送次數(shù)
- -r阻塞接收
實驗現(xiàn)象
以RISC-V向A核發(fā)送數(shù)據(jù)為例,緩沖區(qū)大小為511.875K,發(fā)送100次;開辟一個511.875K的緩沖區(qū),A核向RISC-V發(fā)送一百次數(shù)據(jù)。
以下命令按次序執(zhí)行:
| 執(zhí)行端 | 命令 |
|---|---|
| RISC-V端 | rpbuf_test -c -I 0 -N rpbuf_test -L 524160 -a |
| A端 | rpbuf_test -L 524160 -N rpbuf_test -r |
| RISC-V端 | rpbuf_test -N rpbuf_test -C 100 -s |
RISC-V 串口輸出
cpu0>rpbuf_test -c -I 0 -N rpbuf_test -L 524160 -a cpu0>[RPBUF_INFO][rpbuf_addr_remap_default:206]reamp pa:0x42144000 -> va:0x42144000 [RPBUF_INFO][rpbuf_service_command_buffer_created_handler:827]buffer "rpbuf_test" (id:0): local_dummy_buffers -> buffers buffer "rpbuf_test" is available cpu0>rpbuf_test -N rpbuf_test -C 100 -s [0]data:21a94801873e262b487f31000da27543... [md5:fd0f42ddde63121837ebcdec775250b9]
A核串口輸出
root@OKT153:/# rpbuf_test -L 524160 -N rpbuf_test -r ping: 8099.576172ms bandwidth: 0.517149Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.155000ms bandwidth: 186.086807Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.721000ms bandwidth: 181.881592Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.694000ms bandwidth: 181.992096Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.680000ms bandwidth: 182.055313Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.712000ms bandwidth: 181.779083Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success ping: 14.690000ms bandwidth: 182.276901Mbps data:21a94801873e262b487f31000da27543... check:fd0f42ddde63121837ebcdec775250b9 success
測試數(shù)據(jù)顯示,ARM與RISC-V雙核間數(shù)據(jù)傳輸帶寬平均可達 184Mbps,驗證了共享內(nèi)存機制的高效與穩(wěn)定。
4 結(jié)論
全志T153處理器通過 異構(gòu)多核架構(gòu)、 高效異構(gòu)核間通訊機制(IPC)以及與之配套的 智能休眠喚醒方案,可以實現(xiàn)ARM核與RISC-V核的高效協(xié)作——Linux負責復雜運算,RTOS保障實時響應(yīng),同時將 "高性能計算"、 "硬實時控制"與 "超低功耗待機"這三大關(guān)鍵能力融為一體,滿足工業(yè)控制等場景需求。
這遠不止是技術(shù)功能的實現(xiàn),更是為下一代智能硬件提供了 一個量產(chǎn)化、功能完整、性能可靠的芯片級解決方案平臺。
咨詢立即獲得專屬報價
華北區(qū)負責人
華東區(qū)負責人
華南區(qū)負責人
中西區(qū)負責人

