當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號(hào)」一起進(jìn)步!來源|?魚鷹談單片機(jī)在一些比較嚴(yán)格的行業(yè)里面,不是說你的程序能完成必要功能就可以,還需要添加一些額外的功能,比如最常見的看門狗功能,它可以在程序死機(jī)時(shí)完成重啟,但也僅僅如此而已。很多異常它是無法檢查的,比如程序偶然跑飛,ram異常...

關(guān)注「嵌入式大雜燴」,選擇「星標(biāo)公眾號(hào)」一起進(jìn)步!

來源 |?魚鷹談單片機(jī)


在一些比較嚴(yán)格的行業(yè)里面,不是說你的程序能完成必要功能就可以,還需要添加一些額外的功能,比如最常見的看門狗功能,它可以在程序死機(jī)時(shí)完成重啟,但也僅僅如此而已。很多異常它是無法檢查的,比如程序偶然跑飛,ram 異常、flash異常等其他問題,只有程序hardfault或者其他嚴(yán)重問題導(dǎo)致程無法喂狗時(shí)才能起作用。所以有些產(chǎn)品為了保障安全,會(huì)增加安規(guī)代碼,保證程序能夠正常運(yùn)行(UL/CSA/IEC 60730-1/60335-1 B類認(rèn)證)。

自檢內(nèi)容

MCU 安全檢查一般包括以下幾個(gè)方面:

1、CPU 自測(寄存器測試)
2、系統(tǒng)時(shí)鐘頻率測量(保證時(shí)鐘正常工作,不快也不慢,GD 芯片在短路晶振后,程序暫停運(yùn)行,無法檢查,但是 ST 芯片會(huì)自動(dòng)切換到內(nèi)部時(shí)鐘,可以由程序檢查這種異常)
3、RAM 自檢
4、FLASH 存儲(chǔ)器完整性檢查
5、獨(dú)立看門狗、窗口看門狗檢查
6、安全相關(guān)變量檢查
7、中斷檢查
8、I/O 口檢查
9、棧檢查
10、程序流程控制
11、AD 口檢查

你會(huì)發(fā)現(xiàn)真要完成這份安規(guī)代碼,難度不是一般的大,不過一般芯片廠商會(huì)提供相關(guān)參考例程和相關(guān)文檔,但不是說有了這些資料就完全沒有問題了。

比如 ST 提供了一個(gè)參考例子,但是它使用的 HAL 庫(事實(shí)上它還有標(biāo)準(zhǔn)庫,當(dāng)時(shí)不知道),如果原本程序用的標(biāo)準(zhǔn)庫,那么就需要進(jìn)行移植,這個(gè)工作量也不是一般大(首先要能理解程序,才能進(jìn)行正確移植,而里面的邏輯還是很復(fù)雜的)。如果你不想移植,還有一個(gè)辦法是使用 lib 庫,就是將相關(guān)功能打包成一個(gè)庫,雖然程序會(huì)大一些(畢竟很多底層代碼和原來的重復(fù)了),但確實(shí)是比較簡單的方法(前提是 flash 夠大)。

魚鷹走的是第一條路,移植,并且將相關(guān)的底層代碼提供了接口,這樣不管是用標(biāo)準(zhǔn)庫還是 HAL 庫,只要自己實(shí)現(xiàn)這這些特定的接口即可完成。

另外,參考例子只是實(shí)現(xiàn)了一個(gè)最基本的功能,在真正的產(chǎn)品不一定能適用。比如你的程序負(fù)載大,而里面為了測量時(shí)鐘頻率,幾百微秒時(shí)間就要進(jìn)入一次中斷(即使是分頻后),如果剛好在中斷產(chǎn)生時(shí),其他程序禁用了中斷,運(yùn)行這些代碼有可能就會(huì)出現(xiàn)問題,很容易錯(cuò)過中斷而導(dǎo)致復(fù)位。

在我一開始移植的時(shí)候就是如此,在一個(gè)簡單的程序里面可以正常運(yùn)行很長時(shí)間,但是移植到產(chǎn)品工程里面,時(shí)不時(shí)出現(xiàn)時(shí)鐘檢查不通過的時(shí)候,導(dǎo)致程序不停重啟,最終魚鷹通過 DMA 傳輸的方式解決了這個(gè)問題,再也不會(huì)因?yàn)闀r(shí)鐘檢查不通過導(dǎo)致重啟了。

另外一個(gè)難點(diǎn)是對(duì) .sct (分散加載)文件的理解,這個(gè)會(huì)在后面介紹。

安規(guī)相關(guān)的內(nèi)容實(shí)在是太多,要寫的話可以寫成一個(gè)系列了,如果各位道友感興趣的話,多多轉(zhuǎn)發(fā)支持一下魚鷹,如果效果不錯(cuò),魚鷹會(huì)考慮完成后續(xù)的其它部分。(這里有一份比較全面但簡單一些的參考文章可以看看 http://news.eeworld.com.cn/mp/STM32/a80041.jspx,只介紹如何做,沒怎么介紹為什么這么做)

資料

ST 相關(guān)資料可以查看以下內(nèi)容(www.st.com,下載時(shí)需要注冊郵箱才行,魚鷹公眾號(hào)后臺(tái)提供了部分資料,可自行領(lǐng)?。?/span>

《AN4435 應(yīng)用筆記》中文版,《AN277》(ROM Self-Test)
STM8-SafeCLASSB
https://www.st.com/en/embedded-software/stm8-safeclassb.html

STM32-CLASSB-SPL(基于標(biāo)準(zhǔn)外設(shè)庫)
https://www.st.com/en/embedded-software/stm32-classb-spl.html#tools-software

X-CUBE-CLASSB(基于HAL庫)
https://www.st.com/en/embedded-software/x-cube-classb.html(不同版本有不同芯片,比如 2.2.0 版本的是 Fx 相關(guān)的,2.3.0 是H7、G0 相關(guān)的)

當(dāng)然國產(chǎn)芯片也一般會(huì)提供例程。

本篇筆記只介紹其中一個(gè)內(nèi)容,即 FLASH 檢查,換句話說就是程序完整性檢查。

FLASH 檢查

我們以比較復(fù)雜的 boot app rtos ,開發(fā)環(huán)境 keil 、stm32f103 為例介紹相關(guān)知識(shí)。

一般 boot 和 app 部分是用不同工程管理的,所以 app 部分代碼只能檢查自身的完整性,而不能檢查 boot 部分。

并且 app 的 flash 區(qū)也不是完全檢查的,有一小部分是也沒法檢查的,但這并不影響它的功能(既然已經(jīng)跳轉(zhuǎn)到 app 里面了,那么 boot 部分 flash 即使在運(yùn)行時(shí)有問題也不影響功能,而如果變量初始值的flash有問題就是關(guān)鍵變量檢查的問題了)。

現(xiàn)在就是如何檢查的問題了。

如何檢查 | 基本原理

校驗(yàn)手段有很多,比如 和校驗(yàn)、MD5 校驗(yàn)、CRC 校驗(yàn),這里我們使用 CRC,因?yàn)橐话阈酒瑑?nèi)部會(huì)內(nèi)置該外設(shè)硬件計(jì)算(如果沒有,可以純 CPU 計(jì)算)。

然后我們需要了解完整性檢查的基本原理。

所謂程序完整性檢查,就是在下載代碼前,先用工具把要校驗(yàn)的部分通過計(jì)算公式計(jì)算出一個(gè)值,保存在某個(gè)地方(flash),然后程序在運(yùn)行的時(shí)候,自己也去讀取要校驗(yàn)的 flash 部分,通過同樣的計(jì)算公式計(jì)算出一個(gè)值,然后將這個(gè)值和保存在 flash 里面的值進(jìn)行比較,就可以看出代碼是否存在異常了,有異常及時(shí)處理,沒有異常就繼續(xù)重新檢查。

而檢查分成兩個(gè)步驟:

1、開機(jī)時(shí),一次性完成所有計(jì)算,保證運(yùn)行前完整。

2、正常運(yùn)行時(shí),定時(shí)計(jì)算,每次計(jì)算一個(gè)小塊,當(dāng)計(jì)算完最后一塊時(shí)才比較結(jié)果,成功就重新繼續(xù)計(jì)算,失敗則終止程序運(yùn)行,周而往復(fù)(計(jì)算需要較長的時(shí)間,分時(shí)計(jì)算可以不影響程序正常功能),這樣可以保證程序在運(yùn)行時(shí)也能檢查 FLASH 的完整性,防止 FLASH 運(yùn)行過程中破壞掉。

現(xiàn)在有個(gè)問題,CRC 保存在何處才是合適的?

隨便保存在一個(gè)地方肯定是不行的。假設(shè)這個(gè)位置在要校驗(yàn)代碼部分的里面,那么當(dāng)工具計(jì)算這個(gè)值時(shí),又會(huì)篡改掉校驗(yàn)部分里面的數(shù)據(jù)(因?yàn)槟惆?CRC 值放到里面了),那么你的程序校驗(yàn)時(shí),肯定不通過,因?yàn)槟阕x了一個(gè)被改變的 CRC 值。所以這個(gè)值一定要放在代碼的最后面才行。

另外前面說過,運(yùn)行時(shí)會(huì)一小塊一小塊,所以要保證你的 CRC 值存放位置應(yīng)該在小塊大小的邊界位置上。比如一次計(jì)算 16 字節(jié),那你存放的位置應(yīng)該是 16 的倍數(shù)才是正常的。

所以,CRC 存放位置存在這兩個(gè)限制。

另外,如何提前計(jì)算好 CRC 的值呢?IAR 內(nèi)置該功能,而 KEIL 我們可以借助強(qiáng)大的開源工具 SRecord《功能強(qiáng)大的 HEX 開源轉(zhuǎn)換工具,你值得擁有》(一轉(zhuǎn)眼,這篇文章差不多鴿了四個(gè)多月了)幫助我們計(jì)算。

基本知識(shí)都了解的差不多了,接下來就是如何操作的問題。

實(shí)操

1、固定 CRC 位置。

我們可以在啟動(dòng)文件的最后加入以下代碼(END 前

這里默認(rèn)是 0x3D334398,但會(huì)在后續(xù)修改成正確的 CRC 值

;*******************************************************************************; User Checksum - must be placed at the end of memory;******************************************************************************* AREA CHECKSUM, DATA, READONLY, ALIGN=6 EXPORT __Check_Sum
; Alignement here must correspond to the size of tested block at FLASH run time test (16 words ~ 64 bytes)!!! ALIGN
__Check_Sum DCD 0x3D334398; ; Check sum computed externaly這里保證了 __Check_Sum 的地址是 2 ^ 6 大小對(duì)齊,所以你的計(jì)算小塊可以這個(gè)大小,當(dāng)然也可以小一些,比如 2 ^ 5 等。這樣就可以將檢查部分分成固定的小塊,不會(huì)多,也不會(huì)少,剛剛好(必須)。

那么如何將這個(gè)地址固定在代碼最后呢?這個(gè)時(shí)候就需要我們的 .sct 文件發(fā)揮作用了(ClassB_stm32F10x.sct)。

ER_IROM1 0x08000000 0x10000 { ; load address = execution address *.o (RESET, First) *(InRoot$$Sections) .ANY ( RO) *.o (CHECKSUM, Last) ;放置在最后 }我們用了 Last 將其放置在代碼的最后部分,你想把它放置在 bin 文件最后面?暫時(shí)魚鷹還沒想到怎么做,有知道的道友可以告訴魚鷹(通過 sct 的方式)。

2、CRC 計(jì)算腳本
在 windows 叫批處理,.bat ,我們可以在參考例程中找到。crc_gen_keil.bat

我們需要需改三個(gè)位置

第一個(gè)是你的計(jì)算工具的路徑,里面應(yīng)該要有計(jì)算工具。

第二個(gè)就是你的工程名字,我們通過下面位置確定(魚鷹用的 Main):

最后是工程路徑。一般在 Objects 文件夾里面,而 map 文件一般在 Listings 文件夾里面。

說白了,這些變量就是為了讓腳本能夠找到 map、hex 文件和工具。但一般默認(rèn)工程,這兩個(gè)文件可能不在一個(gè)文件夾里面,所以我們可以對(duì)例子中的批處理文件 crc_gen_keil.bat 進(jìn)行適當(dāng)修改。

map 文件的作用是為了讓腳本能夠搜索到 __Check_Sum 的地址,然后就可以計(jì)算 CRC 并修改 HEX 里面這個(gè)值了。

另外還有新增了一個(gè)變量 HEX_ADRR,當(dāng)我們的計(jì)算位置不是從 0x08000000 開始時(shí)(比如 app 起始地址在 0x08009000),我們就可以修改這個(gè)變量值。還有我們希望在計(jì)算完并修改 CRC 后可以自己生成 bin 文件方便我們更新固件,還需要加入轉(zhuǎn)化成 bin 的命令。

其中為了下載修改(CRC)后的 HEX 文件,我們還需要簡單修改一下,用于判斷工具是否存在,不存在,直接刪除 hex 和 axf 文件(防止下載未修改的文件)。
%xxx% 類似腳本中的 $xxx

if not exist %SREC_PATH% ( echo %SREC_PATH% is not exit, exit echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% --------------- del %INPUT_HEX% %AXF_FILE% exit)

這樣可以保證,一定能夠正確下載 HEX 文件,而不是下載默認(rèn)的 axf 文件。
否則,下載的默認(rèn) axf 文件會(huì)因?yàn)?CRC 未修改,
程序?qū)⒉粩嘀貑?/span>。
完整的修改(可以自行對(duì)比官方例程文件):

@echo offECHO Computing CRCECHO -------------------------------------REM Batch script for generating CRC in KEIL projectREM Must be placed at MDK-ARM folder (project folder)
REM Path configurationSET SREC_PATH=C:\SRECSET MAP_NAME=STM3210C_EVALSET MAP_PATH=STM3210C_EVALSET TARGET_NAME=STM3210C_EVALSET TARGET_PATH=STM3210C_EVALSET BYTE_SWAP=1SET COMPARE_HEX=1SET CRC_ADDR_FROM_MAP=1REM Not used when CRC_ADDR_FROM_MAP=1SET CRC_ADDR=0x08007ce0
REM Derived configurationSET HEX_ADRR=0x08000000SET MAP_FILE=%MAP_PATH%\%MAP_NAME%.mapSET AXF_FILE=%TARGET_PATH%\%MAP_NAME%.axfSET INPUT_HEX=%TARGET_PATH%\%TARGET_NAME%.hexSET OUTPUT_HEX=%TARGET_PATH%\%TARGET_NAME%_CRC.hexSET OUTPUT_BIN=.\%TARGET_NAME%_CRC.binSET TMP_FILE=crc_tmp_file.txt
if not exist %SREC_PATH%\srec_cat.exe ( echo %SREC_PATH% is not exit, exit echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% --------------- del %INPUT_HEX% %AXF_FILE% exit)
IF NOT "%CRC_ADDR_FROM_MAP%"=="1" goto:end_of_map_extractionREM Extract CRC address from MAP fileREM -----------------------------------------------------------REM Load line with checksum location to crc_search variableECHO Extracting CRC address from MAP fileFINDSTR /R /C:"^ *CHECKSUM" %MAP_FILE%>%TMP_FILE%SET /p crc_search=<%TMP_FILE%DEL %TMP_FILE%REM remove '(' character and string after, which causes errorsfor /f "tokens=1 delims=(" %%a in ("%crc_search%") do set crc_search=%%aREM remove CHECKSUM string from variableSET crc_search=%crc_search:CHECKSUM=%REM get first word at line, which should be CRC address in HEX formatfor /f "tokens=1 delims= " %%a in ("%crc_search%") do set CRC_ADDR=%%aREM -----------------------------------------------------------REM End of CRC address extraction:end_of_map_extraction
REM Compute CRC and store it to new HEX fileECHO CRC address: %CRC_ADDR%if "%BYTE_SWAP%"=="1" (REM ECHO to see what is going onECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -byte_swap 4 ^ -stm32-b-e %CRC_ADDR% ^ -byte_swap 4 ^ -o %TMP_FILE% -intel %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -byte_swap 4 ^ -stm32-b-e %CRC_ADDR% ^ -byte_swap 4 ^ -o %TMP_FILE% -intel ) else (REM ECHO to see what is going onECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -stm32-l-e %CRC_ADDR% ^ -o %TMP_FILE% -intel%SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel ^ -crop %HEX_ADRR% %CRC_ADDR% ^ -stm32-l-e %CRC_ADDR% ^ -o %TMP_FILE% -intel)ECHO %SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^ %TMP_FILE% -intel ^ -o %OUTPUT_HEX% -intel%SREC_PATH%\srec_cat.exe ^ %INPUT_HEX% -intel -exclude -within %TMP_FILE% -intel ^ %TMP_FILE% -intel ^ -o %OUTPUT_HEX% -intelREM Delete temporary fileDEL %TMP_FILE%ECHO Modified HEX file with CRC stored at %OUTPUT_HEX%
REM Compare input HEX file with output HEX fileif "%COMPARE_HEX%"=="1" (ECHO Comparing %INPUT_HEX% with %OUTPUT_HEX%%SREC_PATH%\srec_cmp.exe ^ %INPUT_HEX% -intel %OUTPUT_HEX% -intel -v)
del %INPUT_HEX%
ECHO %SREC_PATH%\srec_cat.exe ^ %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary%SREC_PATH%\srec_cat.exe ^ %OUTPUT_HEX% -intel -offset -%HEX_ADRR% -o %OUTPUT_BIN% -binary
ECHO -------------------------------------3、 CRC 計(jì)算部分代碼(摘自官方例程)
完整計(jì)算


分小塊計(jì)算

需要注意的是,每次全部檢查完之后得復(fù)位一下 CRC 外設(shè),否則會(huì)繼續(xù)用之前的結(jié)果繼續(xù)計(jì)算。

4、工程配置
準(zhǔn)備好前面的內(nèi)容后,即可進(jìn)行工程配置。
生成 HEX

使用 debug 按鈕時(shí)下載的文件:
crc_load.ini (需要根據(jù)自己的工程自行修改)

特別注意里面的雙反斜杠,沒有它,將找不到正確路徑。這里以工程文件(.uvprojx)所在路徑為相對(duì)路徑。

使用 load 按鈕時(shí)下載配置:

不然你下載(點(diǎn)擊 load)的時(shí)候,就會(huì)下載默認(rèn)的 axf 文件,而 axf 里面的 CRC 值也是默認(rèn)的,并沒有被修改,所以這一步也是必須的。

使用修改的分散加載文件,這可以保證我們的 CRC 存放位置在代碼最后面。

最后一步,當(dāng)編譯完成后,讓工具幫我們自動(dòng)計(jì)算 CRC 值,并將值修改到 HEX 文件里面。

添加我們前面的批處理文件:

這樣所有的工程配置就完成了。

效果

我們可以看看效果。

首先,我們并沒有添加工具,我們可以看到,腳本自動(dòng)退出了,并且刪除了 hex 文件和 axf 文件,這樣就不會(huì)下載錯(cuò)誤的 HEX 文件了(點(diǎn)擊下載會(huì)發(fā)現(xiàn)找不到 axf 文件)。

當(dāng)我們在 C 盤添加工具后編譯:

從這里我們可以得到幾點(diǎn)信息:
1、計(jì)算范圍 0x08000000 ~ 0x08007640。
2、CRC 存放位置在 0x08007640,四個(gè)字節(jié)
3、可以使用 srec_cmp.exe 比較兩個(gè) HEX 文件的區(qū)別(修改前和修改后)。這里的區(qū)別在 0x08007640 ~ 0x8007643。
4、生成的 bin 文件和 hex 文件相對(duì)存放路徑。

大功告成!

工具命令解釋

現(xiàn)在我們可以從這里了解到三個(gè)命令。

C:\SREC\srec_cat.exe???STM3210C_EVAL\STM3210C_EVAL.hex?-intel???-crop?0x08000000?0x08007640???-byte_swap?4???-stm32-b-e?0x08007640???-byte_swap?4???-o?crc_tmp_file.txt?-intel這個(gè)命令用于截取 0x08000000~0x08007640 的內(nèi)容并計(jì)算 CRC 值,并且在 0x08007640 位置處寫入 CRC 值。0x08007640 由 map 文件得出,即 __Check_Sum 的地址。

C:\SREC\srec_cat.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel -exclude -within crc_tmp_file.txt -intel crc_tmp_file.txt -intel -o STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel該命令用于將兩個(gè) HEX 文件合并,如果以 crc_tmp_file.txt 文件為基準(zhǔn),即同一個(gè)地址的值如果不同,則保留 crc_tmp_file.txt 里面的(里面有正確的 CRC),-intel 代表 HEX 文件類型。

C:\SREC\srec_cmp.exe STM3210C_EVAL\STM3210C_EVAL.hex -intel STM3210C_EVAL\STM3210C_EVAL_CRC.hex -intel -v終于搞定啦,可以放下這個(gè)了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉