當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 本文詳細(xì)介紹了把μC/OS-Ⅱ移植到ATMEL公司的8位微控制器ATmega128上的全過程。所謂移植,就是使一個實(shí)時內(nèi)核能在某個微處理器或微控制器上運(yùn)行。在移植之前,希望讀者能

 本文詳細(xì)介紹了把μC/OS-Ⅱ移植到ATMEL公司的8位微控制器ATmega128上的全過程。所謂移植,就是使一個實(shí)時內(nèi)核能在

某個微處理器或微控制器上運(yùn)行。在移植之前,希望讀者能熟悉所用微處理器和C編譯器的特點(diǎn)。

1 ATmega128的內(nèi)核特點(diǎn)

之所以要先介紹ATmega128 MCU內(nèi)核特點(diǎn),是因?yàn)樵?mu;C/OS-Ⅱ的移植過程中,仍需要用戶用C語言和匯編語言編寫一些與微

處理器相關(guān)的代碼。這里主要介紹ATmega128與μC/OS-Ⅱ移植相關(guān)的內(nèi)核特點(diǎn)。如果讀者已經(jīng)對ATmega128 比較了解了,

那就不必閱讀這一部分了。

1.1微控制器 (MCU)

ATmega128的MCU包括一個算術(shù)邏輯單元(ALU),一個狀態(tài)寄存器(SREG),一個通用工作寄存器組和一個堆棧指針。狀態(tài)

寄存器(SREG)的最高位I是全局中斷允許位。如果全局中斷允許位為零,則所有中斷都被禁止。當(dāng)系統(tǒng)響應(yīng)一個中斷后,I位將由硬件自動清“0”;當(dāng)執(zhí)行中斷返回(RETI)指令時,I位由硬件自動置“1” ,從而允許系統(tǒng)再次響應(yīng)下一個中斷請求。

通用工作寄存器組是由32個8位的通用工作寄存器組成。其中R26~R31這6個寄存器還可以兩兩合并為3個16位的間接地址寄存器。這些寄存器可以用來對數(shù)據(jù)存儲空間進(jìn)行間接尋址。這3個間接地址寄存器的名稱為:X寄存器、Y寄存器、Z寄存器。其中Z寄存器還能用作對程序存儲空間進(jìn)行間接尋址的寄存器。有些AVR C語言編譯器還把Y寄存器作為軟件堆棧的堆棧指針,比如ICC- AVR,CodevisionAVR。

堆棧指針(SP)是一個指示堆棧頂部地址的16位寄存器。在ICCAVR中,它被用作指向硬件堆棧的堆棧指針。AVR單片

機(jī)上電復(fù)位后,SP指針的初始值為0x0000,由于AVR單片機(jī)的堆棧是向下生長的(從高地址向低地址生長),所以系統(tǒng)程序

一開始必須對堆棧指針SP進(jìn)行初始化,即將SP的值設(shè)為數(shù)據(jù)存儲空間的最高地址。ICCAVR編譯器在鏈接C程序文件的時 候,會自動在程序頭鏈入startup文件。startup文件里面的程序?qū)プ龀跏蓟疭P指針的工作。鏈入startup文件是ICCAVR 這個編譯器的特點(diǎn),在用其它編譯器的時候,希望讀者確認(rèn)所使用的編譯器是否帶有自動初始化SP的功能,若沒有,應(yīng)在 用戶程序中初始化SP。

1.2 數(shù)據(jù)存儲空間(僅內(nèi)部)

AVR單片機(jī)的數(shù)據(jù)存儲器是線形的,從低地址到高地址依次是CPU寄存器區(qū)(32個通用寄存器),I/O寄存器區(qū),數(shù)據(jù)存儲區(qū)ICCAVR編譯器又將數(shù)據(jù)存儲區(qū)劃分為全局變量和字符串區(qū),軟件堆棧區(qū)和硬件堆棧區(qū)三個空間。

高地址

硬件堆棧區(qū)

軟件堆棧區(qū)

全局變量和字符串區(qū)

I/O寄存器區(qū)

CPU寄存器區(qū)

低地址

ICCAVR編譯器將堆棧分成了兩個功能不同的堆棧來處理(這一點(diǎn)與8051系列的單片機(jī)編譯器處理方式不同)。硬件堆棧用于儲存子程序和中斷服務(wù)子程序調(diào)用時的函數(shù)返回地址。這塊數(shù)據(jù)區(qū)域由堆棧指針SP進(jìn)行尋址,數(shù)據(jù)的進(jìn)棧和出棧有專門的匯編指令(pop,push等)支持,所以叫做硬件堆棧區(qū)。軟件堆棧用于傳遞參數(shù),儲存臨時變量和局部變量。這塊數(shù)據(jù)區(qū)域是用軟件模擬堆棧儲存數(shù)據(jù)的方式進(jìn)行數(shù)據(jù)存儲,對該區(qū)域?qū)ぶ返闹羔樣捎脩糇约憾x,所以叫做軟件堆棧區(qū)。AVR單片機(jī)的硬件堆棧的生長方向是向下的(從高地址向低地址生長),所以軟件堆棧在定義的時候,也采取相同的 生長方向。

這里沒有用ATmega128而采用AVR單片機(jī)的提法是因?yàn)锳Tmega128屬于AVR系列單片機(jī)中的一種,而所有的AVR單片機(jī)的數(shù)據(jù)存儲器組織方式都是一致的。在創(chuàng)建μC/OS-Ⅱ的任務(wù)棧時,需要了解所用微處理器數(shù)據(jù)存儲空間尤其是堆棧空間的組 形式及相關(guān)的操作。讀者應(yīng)參閱所用微處理器的資料和編譯器的幫助文檔,了解該部分知 識。

1.3 ATmega128的中斷響應(yīng)機(jī)制

ATmega128有34個不同的中斷源,每個中斷源和系統(tǒng)復(fù)位在程序存儲空間都有一個獨(dú)立的中斷向量(中斷入口地址)。每個中斷源都有各自獨(dú)立的中斷允許控制位,當(dāng)某個中斷源的中斷允許控制位為“1”且全局中斷允許位I也為“1”時,系統(tǒng)才響應(yīng)該中斷。

當(dāng)系統(tǒng)響應(yīng)一個中斷請求后,會自動將全局中斷允許位I清零,此時,后續(xù)中斷響應(yīng)被屏蔽。當(dāng)系統(tǒng)執(zhí)行中斷返回指令RETI時,會將全局中斷允許位I置“1”,以允許響應(yīng)下一個中斷。若用戶想實(shí)現(xiàn)中斷嵌套,必須在中斷服務(wù)子程序中將全局中斷允許位I置“1”。(這一點(diǎn)與8051系列的單片機(jī)不同)中斷向量表中,處于低地址的中斷具有高的優(yōu)先級。優(yōu)先級高只是表明在多個中斷同時發(fā)生的時候,系統(tǒng)先響應(yīng)優(yōu) 先級高的中斷,并不含有高優(yōu)先級的中斷能打斷低優(yōu)先級的中斷處理工程的意思。這與8051系列單片機(jī)的中斷優(yōu)先級概念

不同。

由于μC/OS-Ⅱ的任務(wù)切換實(shí)際上是模擬一次中斷,因此需要知道CPU的中斷響應(yīng)機(jī)制。中斷發(fā)生時,ATmega128按以下

步驟順序執(zhí)行:

A. 全局中斷允許位I清零。

B. 將指向下一條指令的PC值壓入堆棧,同時堆棧指針SP減2。

C. 選擇最高優(yōu)先級的中斷向量裝入PC,程序從此地址繼續(xù)執(zhí)行中斷處理。

D. 當(dāng)執(zhí)行中斷處理時,中斷源的中斷允許控制位清零。

中斷結(jié)束后,執(zhí)行RETI指令,此時

A. 全局中斷允許位I置“1”。

B. PC從堆棧推出,程序從被中斷的地方繼續(xù)執(zhí)行。

特別要注意的是:AVR單片機(jī)在響應(yīng)中斷及從中斷返回時,并不會對狀態(tài)寄存器SREG和通用寄存器自動進(jìn)行保存和恢復(fù)操作,因此,對狀態(tài)寄存器SREG和通用寄存器的中斷保護(hù)工作必須由用戶來完成。

1.4 ATmega128的定時器中斷

ATmega128有三個定時器:T0,T1,T2;它們?nèi)叨加杏?jì)數(shù)溢出中斷功能,而且T1和T2還有匹配比較中斷,即定時器計(jì)數(shù)到設(shè)定的值時,產(chǎn)生中斷并自動清零。若系統(tǒng)采用這種中斷方式,其好處是在中斷服務(wù)程序ISR中不需要重新裝載定時器的值。但本文出于通用性的考慮,仍采用定時器計(jì)數(shù)溢出中斷方式

2 μC/OS-Ⅱ的移植

2.1移植條件

要實(shí)現(xiàn)μC/OS-Ⅱ的移植,所用的處理器和編譯器必須滿足一定的條件:

(1) 所用的C編譯器能產(chǎn)生可重入代碼。

可重入代碼是指可以被一個以上的任務(wù)調(diào)用,而不必?fù)?dān)心其數(shù)據(jù)會被破壞的代碼??芍厝氪a任何時候都可以被中斷,一段時間以后又可以重新運(yùn)行,而相應(yīng)的數(shù)據(jù)不會丟失,不可重入代碼則不行。本文所使用ImageCraft公司的ICCAVR V6.29編譯器能產(chǎn)生可重入代碼。[!--empirenews.page--]

(2) 用C語言就可以打開和關(guān)閉中斷。

本文所使用的ICCAVR V6.29編譯器支持在C語言中內(nèi)嵌匯編語句且提供專門開關(guān)中斷的宏:CLI()和SEI()。這樣,使得在C語言中開關(guān)中斷非常方便。

(3) 處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10至100Hz之間)本文使用的ATmega128,有3個定時器,能產(chǎn)生μC/OS-Ⅱ所需的定時中斷。

(4) 處理器支持能夠容納一定數(shù)量數(shù)據(jù)的硬件堆棧。本文使用的ATmega128有4K RAM,硬件堆棧可以開辟在這4K RAM中。

(5) 處理器有將堆棧指針和其它CPU寄存器從內(nèi)存中讀出和存儲到堆棧或內(nèi)存中的指令。一般的單片機(jī)都滿足這個要求(如PUSH、POP指令),且ATmega128還具有直接訪問I/O寄存器的指令(IN、OUT等),它比8051系列的單片機(jī)更容易實(shí)現(xiàn)上述要求。

2.2移植的實(shí)現(xiàn)

μC/OS-Ⅱ的移植工作包括以下幾個內(nèi)容:

用typedef聲明與編譯器相關(guān)的10個數(shù)據(jù)類型(OS_CPU.H)

用#define設(shè)置一個常量的值(OS_CPU.H)

#define聲明三個宏(OS_CPU.H)

用C語言編寫六個簡單的函數(shù)(OS_CPU_C.C)

編寫四個匯編語言函數(shù)(OS_CPU_A.S)

根據(jù)這幾項(xiàng)內(nèi)容,本文逐步來完成。

2.2.1 INCLUDES.H文件

是主頭文件,在所有后綴名為.C的文件的開始都包含INCLUDES.H文件。使用INCLUDES.H的好處是所有的.C文件都只包含一個頭文件,簡潔,可讀性強(qiáng)。缺點(diǎn)是.C文件可能會包含一些它并不需要的頭文件,增加編譯時間。我們是以增加編譯時間為代價(jià)來換取程序的可移植性的。用戶可以改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。

程序清單L2.2.1 INCLUDES.H.

#include // ATmega128的寄存器頭文件

#include // ICCAVR的宏

#include

#include

#include

#include //一些C語言的標(biāo)準(zhǔn)庫

/*

***************************************************************************

* μC/OS-Ⅱ 頭文件

***************************************************************************

*/

#include "G:\Porting\ICCAVR\porting12_8\ATmega128\os_cpu.h"

#include "G:\Porting\ICCAVR\Porting12_8\EX1_mega128\os_cfg.h"

#include "G:\Porting\ICCAVR\Porting12_8\SOURCE\ucos_ii.h"

要注意,μC/OS-Ⅱ 的3個頭文件的先后順序是:os_cpu.h,os_cfg.h最后是ucos_ii.h。

2.2.2 OS_CPU.H文件

OS_CPU.H包括了用#define定義的與處理器相關(guān)的常量、宏和類型定義。其中需要注意以下三點(diǎn):

一是堆棧的生長方向。正如前面所述,ATmega128的堆棧生長方向是向下生長,即從高地址到低地址,因此,OS_STK_GROWTH要被定義為1。

二是進(jìn)入臨界代碼段(critical code section)的方法。μC/OS-II提供了三種進(jìn)入臨界代碼段的方法,第一種方法是直接對中斷允許位置1或清零,即進(jìn)入臨界代碼段時,把中斷允許位清零,退出臨界代碼段時,把中斷允許位置1;第二種方法是進(jìn)入臨界代碼段時,先將中斷狀態(tài)保存到堆棧中,然后關(guān)閉中斷。與之對應(yīng)的是,退出臨界代碼段時,從堆棧中恢復(fù)前面保存的中斷狀態(tài)。第三種方法是,由于某些編譯提供了擴(kuò)展功能,用戶可以得到當(dāng)前處理器狀態(tài)字的值,并將其保存在C函的局部變量之中。這個變量可用于恢復(fù)狀態(tài)寄存器SREG的值。由于ICCAVR不提供此項(xiàng)擴(kuò)展功能,所以本文暫不考慮用第 三種方法進(jìn)入臨界代碼段。第一種方法存在著一個小小的問題:如果在關(guān)閉中斷后調(diào)用μC/OS-II的功能函數(shù),當(dāng)函數(shù)返 回后,中斷可能會被打開。我們希望如果在調(diào)用μC/OS-II的功能函數(shù)前,中斷是關(guān)著的,那么在函數(shù)返回后,中斷仍然是關(guān)著的。方法1顯然不滿足要求。本文使用μC/OS-II的第二種方法——先將中斷狀態(tài)保存到堆棧中,然后關(guān)閉中斷。

三是任務(wù)切換函數(shù)OS_TASK_SW( )是個宏,具體的實(shí)現(xiàn)是在OSCtxSw( )(OS_CPU_A.S)中程序清單L 2.2.2 OS_CPU.H.

#ifdef OS_CPU_GLOBALS

#define OS_CPU_EXT

#else

#define OS_CPU_EXT extern

#endif

/*

**************************************************************************

* 數(shù)據(jù)類型

* (與編譯器相關(guān)的內(nèi)容)

*************************************************************************

*/

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U; // 無符號8位數(shù)

typedef signed char INT8S; // 帶符號8位數(shù)

typedef unsigned int INT16U; // 無符號16位數(shù)

typedef signed int INT16S; // 帶符號16位數(shù)

typedef unsigned long INT32U; // 無符號32位數(shù)

typedef signed long INT32S; // 帶符號32位數(shù)

typedef float FP32; // 單精度浮點(diǎn)數(shù)

typedef unsigned char OS_STK; // 堆棧入口寬度為8位

typedef unsigned char OS_CPU_SR; // 定義狀態(tài)寄存器為8位

/*

*************************************************************************

*

*方法 #1: 用簡單指令開關(guān)中斷。

* 注意,用方法1關(guān)閉中斷,從調(diào)用函數(shù)返回后中斷會重新打開!

* 方法 #2: 關(guān)中斷前保存中斷被關(guān)閉的狀態(tài).

*

*************************************************************************

*/

#define OS_CRITICAL_METHOD 2

#if OS_CRITICAL_METHOD == 1

#define OS_ENTER_CRITICAL() _CLI() // 關(guān)閉中斷

#define OS_EXIT_CRITICAL() _SEI() // 打開中斷

#endif

#if OS_CRITICAL_METHOD == 2

#define OS_ENTER_CRITICAL() asm("st -y,r16\n in r16,0x3F\n cli\n push r16\n

ld r16,y+"); // 關(guān)閉中斷

#define OS_EXIT_CRITICAL() asm("st -y,r16\n pop r16\n out 0x3F,r16\n ld[!--empirenews.page--]

r16,y+"); // 打開中斷

#endif

#define OS_STK_GROWTH 1 // 堆棧向下生長

#define OS_TASK_SW() OSCtxSw()

2.2.3 OS_CPU_C.C文件

μC/OS-II的移植需要用戶編寫OS_CPU_C.C中的十個函數(shù):

OSTaskStkInit();

OSInitHookBegin ();

OSInitHookEnd ();

OSTaskCreateHook();

OSTaskDelHook();

OSTaskSwHook();

OSTaskStatHook();

OSTimeTickHook();

OSTCBInitHook ();

OSTaskIdleHook ();

實(shí)際需要修改的只有OSTaskStkInit()函數(shù),其它九個函數(shù)都是由用戶定義的。如果用戶需要使用這九個函數(shù),可將文件OS_CFG.H中的#define constant

OS_CPU_HOOKS_EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)。本文自定義的任務(wù)堆棧結(jié)構(gòu)下圖所示。函數(shù)OSTaskStkInit()是由OSTaskCreate()或OSTaskCreateExt()調(diào)用,用來初始化任務(wù)堆棧的。經(jīng)初始化后的任務(wù)堆棧應(yīng)該跟發(fā)生過一次中斷后任務(wù)的堆棧結(jié)構(gòu)一樣。由前敘述可知,ATmega128在發(fā)生中斷后,自動保存了程序計(jì)數(shù)器PC。為了

保存全部現(xiàn)場,還需要保存狀態(tài)寄存器SREG,R0~R31這32個通用寄存器及SP的值。

需要注意的是:μC/OS-Ⅱ規(guī)定,在建立任務(wù)時,只能傳遞一個參數(shù)給任務(wù),而且這個參數(shù)是一個指針;ICCAVR編譯器規(guī)定,傳遞給函數(shù)的第一個參數(shù)是放在R16、R17中的,所以在R16、R17的位置中放置的是向任務(wù)傳遞的參數(shù)。R28、R29的 值不需要入棧,是因?yàn)镽28、R29所組成的Y指針被用作軟件堆棧的指針返回給調(diào)用函數(shù)。

根據(jù)上述自定義任務(wù)堆棧的結(jié)構(gòu),編寫OSTaskStkInit()。其程序清單如2.2.3所示。

程序清單L 2.2.3 OS_CPU_C.C

#define OS_CPU_GLOBALS

#include "G:\Porting\ICCAVR\porting12_8\EX1_mega128\includes.h" //包含頭文件

/*

*************************************************************************

* 九個接口函數(shù)(暫未使用)

*************************************************************************

*/

#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203

void OSInitHookBegin (void)

{

}

#endif

... ...

/*

*************************************************************************

* OSTaskStkInit()

*************************************************************************

*/

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos,

INT16U opt)

{

INT8U *psoft_stk;

INT8U *phard_stk; //為操作AVR單片機(jī)軟、硬件堆棧而建立的臨時指針

INT16U tmp;

opt = opt; //'opt'未使用,此處可防止編譯器的警告

psoft_stk = (INT8U *)ptos; // 載入堆棧指針

phard_stk = (INT8U *)ptos

- OS_TASK_SOFT_STK_SIZE // 任務(wù)棧??臻g的大小

L1

+ OS_TASK_HARD_STK_SIZE; // 系統(tǒng)返回的堆棧(硬件堆棧) L2

tmp = *(INT16U const *)task;

*phard_stk-- = (INT8U)tmp;

*phard_stk-- = (INT8U)(tmp >> 8); //把任務(wù)入口地址放入硬件堆棧

//******************通用寄存器入棧**************************/

*psoft_stk-- = (INT8U)0x00; // R0 = 0x00 L3

*psoft_stk-- = (INT8U)0x01; // R1 = 0x01

*psoft_stk-- = (INT8U)0x02; // R2 = 0x02

*psoft_stk-- = (INT8U)0x03; // R3 = 0x03

*psoft_stk-- = (INT8U)0x04; // R4 = 0x04

*psoft_stk-- = (INT8U)0x05; // R5 = 0x05

*psoft_stk-- = (INT8U)0x06; // R6 = 0x06

*psoft_stk-- = (INT8U)0x07; // R7 = 0x07

*psoft_stk-- = (INT8U)0x08; // R8 = 0x08

*psoft_stk-- = (INT8U)0x09; // R9 = 0x09

*psoft_stk-- = (INT8U)0x10; // R10 = 0x10

*psoft_stk-- = (INT8U)0x11; // R11 = 0x11

*psoft_stk-- = (INT8U)0x12; // R12 = 0x12

*psoft_stk-- = (INT8U)0x13; // R13 = 0x13

*phard_stk-- = (INT8U)tmp;

*phard_stk-- = (INT8U)(tmp >> 8); //把任務(wù)入口地址放入硬件堆棧

//***********R16、R17的位置中放置向任務(wù)傳遞的參數(shù)*****************/

tmp = (INT16U)p_arg;

*psoft_stk-- = (INT8U)tmp;

*psoft_stk-- = (INT8U)(tmp >> 8);

*psoft_stk-- = (INT8U)0x18; // R18 = 0x18

*psoft_stk-- = (INT8U)0x19; // R19 = 0x19

*psoft_stk-- = (INT8U)0x20; // R20 = 0x20

*psoft_stk-- = (INT8U)0x21; // R21 = 0x21

*psoft_stk-- = (INT8U)0x22; // R22 =

0x22

*psoft_stk-- = (INT8U)0x23; // R23 = 0x23

*psoft_stk-- = (INT8U)0x24; // R24 =

0x24

*psoft_stk-- = (INT8U)0x25; // R25 = 0x25

*psoft_stk-- = (INT8U)0x26; // R26 = 0x26

*psoft_stk-- = (INT8U)0x27; // R27 = 0x27

/***R28、R29用作軟件堆棧的指針儲存在任務(wù)控制塊OS_TCB的OSTCBStkPtr中***/

*psoft_stk-- = (INT8U)0x30; // R30 = 0x30

*psoft_stk-- = (INT8U)0x31; // R31 = 0x31L2

*psoft_stk-- = (INT8U)0x80; // SREG = 0x80,開全局中

tmp = (INT16U)phard_stk;

*psoft_stk-- = (INT8U)(tmp >> 8); // SPH

*psoft_stk = (INT8U) tmp; // SPL

return ((void *)psoft_stk);

}

接下去的工作便是測試移植的代碼,具體的測試工作,請參考邵貝貝譯的《嵌入式實(shí)時操作系統(tǒng)μC/OS-II(第2版)》。

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

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

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(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)易近期正在縮減他們對日本游戲市場的投資。

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

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

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

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

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

要點(diǎn): 有效應(yīng)對環(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日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(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)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

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