當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 技術(shù)讓夢(mèng)想更偉大
[導(dǎo)讀]FreeRTOS的信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥量)和遞歸互斥信號(hào)量(以后簡(jiǎn)稱遞歸互斥量)。

ID:技術(shù)讓夢(mèng)想更偉大
整理:李肖遙
FreeRTOS的信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥量)和遞歸互斥信號(hào)量(以后簡(jiǎn)稱遞歸互斥量)。
關(guān)于它們的區(qū)別可以參考《 FreeRTOS系列第19篇---FreeRTOS信號(hào)量》一文。
信號(hào)量API函數(shù)實(shí)際上都是宏,它使用現(xiàn)有的隊(duì)列機(jī)制。這些宏定義在semphr.h文件中。如果使用信號(hào)量或者互斥量,需要包含semphr.h頭文件。
二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量和互斥量信號(hào)量的創(chuàng)建API函數(shù)是獨(dú)立的,但是獲取和釋放API函數(shù)都是相同的;
遞歸互斥信號(hào)量的創(chuàng)建、獲取和釋放API函數(shù)都是獨(dú)立的。

1.信號(hào)量創(chuàng)建

在《FreeRTOS高級(jí)篇5---FreeRTOS隊(duì)列分析》中,我們分析了隊(duì)列的實(shí)現(xiàn)過(guò)程,包括隊(duì)列創(chuàng)建、入隊(duì)和出隊(duì)操作。
在那篇文章中我們說(shuō)過(guò),創(chuàng)建隊(duì)列API函數(shù)實(shí)際是調(diào)用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()來(lái)實(shí)現(xiàn)的。
其實(shí),不但創(chuàng)建隊(duì)列實(shí)際調(diào)用通用隊(duì)列創(chuàng)建函數(shù),二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥量和遞歸互斥量也都直接或間接使用這個(gè)函數(shù),如表1-1所示。
表1-1中紅色字體表示是間接調(diào)用xQueueGenericCreate()函數(shù)。
表1-1:隊(duì)列、信號(hào)量和互斥量創(chuàng)建宏與直接(間接)執(zhí)行函數(shù)

1.1.創(chuàng)建二進(jìn)制信號(hào)量

二進(jìn)制信號(hào)量創(chuàng)建實(shí)際上是直接使用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()。創(chuàng)建二進(jìn)制信號(hào)量API接口實(shí)際上是一個(gè)宏,定義如下:
#define xSemaphoreCreateBinary()         \
xQueueGenericCreate(              \
( UBaseType_t ) 1,       \
semSEMAPHORE_QUEUE_ITEM_LENGTH,  \
NULL,              \
NULL,              \
queueQUEUE_TYPE_BINARY_SEMAPHORE\
)
通過(guò)這個(gè)宏定義我們知道創(chuàng)建二進(jìn)制信號(hào)量實(shí)際上是創(chuàng)建了一個(gè)隊(duì)列,隊(duì)列項(xiàng)有1個(gè),但是隊(duì)列項(xiàng)的大小為0(宏semSEMAPHORE_QUEUE_ITEM_LENGTH定義為0)。
有了隊(duì)列創(chuàng)建的知識(shí),我們可以很容易的畫(huà)出初始化后的二進(jìn)制信號(hào)量?jī)?nèi)存,如圖1-1所示。
圖1-1:初始化后的二進(jìn)制信號(hào)量對(duì)象內(nèi)存或許不止一人像我一樣奇怪,創(chuàng)建一個(gè)沒(méi)有隊(duì)列項(xiàng)存儲(chǔ)空間的隊(duì)列,「信號(hào)量用什么表示?」
其實(shí)二進(jìn)制信號(hào)量的釋放和獲取都是通過(guò)操作隊(duì)列結(jié)構(gòu)體成員uxMessageWaiting來(lái)實(shí)現(xiàn)的(圖1-1紅色部分,uxMessageWaiting表示隊(duì)列中當(dāng)前隊(duì)列項(xiàng)的個(gè)數(shù))。
經(jīng)過(guò)初始化后,變量uxMessageWaiting為0,這說(shuō)明隊(duì)列為空,也就是信號(hào)量處于無(wú)效狀態(tài)。
在使用API函數(shù)xSemaphoreTake()獲取信號(hào)之前,需要先釋放一個(gè)信號(hào)量。后面講到二進(jìn)制信號(hào)量釋放和獲取時(shí)還會(huì)詳細(xì)介紹。

1.2.創(chuàng)建計(jì)數(shù)信號(hào)量

創(chuàng)建計(jì)數(shù)信號(hào)量間接使用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()。創(chuàng)建計(jì)數(shù)信號(hào)量API接口同樣是個(gè)宏定義:
#define xSemaphoreCreateCounting(uxMaxCount, uxInitialCount )             \
xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ), (NULL ) )
創(chuàng)建計(jì)數(shù)信號(hào)量API接口有兩個(gè)參數(shù),含義如下:
  • 「uxMaxCount」:最大計(jì)數(shù)值,當(dāng)信號(hào)到達(dá)這個(gè)值后,就不再增長(zhǎng)了。
  • 「uxInitialCount」:創(chuàng)建信號(hào)量時(shí)的初始值。
我們來(lái)看一下函數(shù)xQueueCreateCountingSemaphore()如何實(shí)現(xiàn)的:
QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_tuxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue )
{
QueueHandle_t xHandle;
configASSERT( uxMaxCount != 0 );
configASSERT( uxInitialCount <= uxMaxCount );
/*調(diào)用通用隊(duì)列創(chuàng)建函數(shù)*/
xHandle =xQueueGenericCreate(
uxMaxCount,
queueSEMAPHORE_QUEUE_ITEM_LENGTH,
NULL,
pxStaticQueue,
queueQUEUE_TYPE_COUNTING_SEMAPHORE );
if( xHandle != NULL )
{
( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;
}
configASSERT( xHandle );
return xHandle;
}
從代碼可以看出,創(chuàng)建計(jì)數(shù)信號(hào)量仍然調(diào)用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()來(lái)創(chuàng)建一個(gè)隊(duì)列,隊(duì)列項(xiàng)的數(shù)目由參數(shù)uxMaxCount指定,每個(gè)隊(duì)列項(xiàng)的大小由宏queueSEMAPHORE_QUEUE_ITEM_LENGTH指出,我們找到這個(gè)宏定義發(fā)現(xiàn),這個(gè)宏被定義為0,也就是說(shuō)創(chuàng)建的隊(duì)列只有隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)空間而沒(méi)有隊(duì)列項(xiàng)存儲(chǔ)空間。
如果隊(duì)列創(chuàng)建成功,則將隊(duì)列結(jié)構(gòu)體成員uxMessageWaiting設(shè)置為初始計(jì)數(shù)信號(hào)量值。初始化后的計(jì)數(shù)信號(hào)量?jī)?nèi)存如圖1-2所示。
圖1-2:初始化后的計(jì)數(shù)信號(hào)量對(duì)象內(nèi)存

1.3創(chuàng)建互斥量

創(chuàng)建互斥量間接使用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()。創(chuàng)建互斥量API接口同樣是個(gè)宏,定義如下:
#define xSemaphoreCreateMutex()             \
xQueueCreateMutex( queueQUEUE_TYPE_MUTEX, NULL )
其中,宏queueQUEUE_TYPE_MUTEX用于通用隊(duì)列創(chuàng)建函數(shù),表示創(chuàng)建隊(duì)列的類型是互斥量,在文章《FreeRTOS高級(jí)篇5---FreeRTOS隊(duì)列分析》關(guān)于通用隊(duì)列創(chuàng)建函數(shù)參數(shù)說(shuō)明中提到了這個(gè)宏。
我們來(lái)看一下函數(shù)xQueueCreateMutex()是如何實(shí)現(xiàn)的:
#if ( configUSE_MUTEXES == 1 )
QueueHandle_t xQueueCreateMutex( const uint8_tucQueueType, StaticQueue_t *pxStaticQueue )
{
Queue_t *pxNewQueue;
const UBaseType_tuxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;
/* 防止編譯器產(chǎn)生警告信息 */
( void ) ucQueueType;
/*調(diào)用通用隊(duì)列創(chuàng)建函數(shù)*/
pxNewQueue = ( Queue_t * )xQueueGenericCreate( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType );
/* 成功分配新的隊(duì)列結(jié)構(gòu)體? */
if( pxNewQueue != NULL )
{
/*xQueueGenericCreate()函數(shù)會(huì)按照通用隊(duì)列的方式設(shè)置所有隊(duì)列結(jié)構(gòu)體成員,但是我們是要?jiǎng)?chuàng)建互斥量.因此需要對(duì)一些結(jié)構(gòu)體成員重新賦值. */
pxNewQueue->pxMutexHolder = NULL;
pxNewQueue->uxQueueType =queueQUEUE_IS_MUTEX;  //NULL
/* 用于遞歸互斥量創(chuàng)建 */
pxNewQueue->u.uxRecursiveCallCount = 0;
/* 使用一個(gè)預(yù)期狀態(tài)啟動(dòng)信號(hào)量 */
( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK);
}
return pxNewQueue;
}
#endif /* configUSE_MUTEXES */
這個(gè)函數(shù)是帶條件編譯的,只有將宏configUSE_MUTEXES定義為1才會(huì)編譯這個(gè)函數(shù)。
函數(shù)首先調(diào)用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()來(lái)創(chuàng)建一個(gè)隊(duì)列,隊(duì)列項(xiàng)數(shù)目為1,隊(duì)列項(xiàng)大小為0,說(shuō)明創(chuàng)建的隊(duì)列只有隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)空間而沒(méi)有隊(duì)列項(xiàng)存儲(chǔ)空間。
如果隊(duì)列創(chuàng)建成功,通用隊(duì)列創(chuàng)建函數(shù)還會(huì)按照通用隊(duì)列的方式 初始化所有隊(duì)列結(jié)構(gòu)體成員。
但是這里要?jiǎng)?chuàng)建的是互斥量,所以有一些結(jié)構(gòu)體成員必須重新賦值。
在這段代碼中,可能你會(huì)疑惑,隊(duì)列結(jié)構(gòu)體成員中,并沒(méi)有pxMutexHolder和uxQueueType!
其實(shí)這兩個(gè)標(biāo)識(shí)符只是宏定義,是專門(mén)為互斥量而定義的,如下所示:
#define pxMutexHolder              pcTail
#define uxQueueType                pcHead
#define queueQUEUE_IS_MUTEX        NULL
當(dāng)隊(duì)列結(jié)構(gòu)體用于互斥量時(shí),成員pcHead和pcTail指針就不再需要,并且將pcHead指針設(shè)置為NULL,表示pcTail指針實(shí)際指向互斥量持有者任務(wù)TCB(如果有的話)。
最后調(diào)用函數(shù)xQueueGenericSend()釋放一個(gè)互斥量,相當(dāng)于互斥量創(chuàng)建后是有效的,可以直接使用獲取信號(hào)量API函數(shù)來(lái)獲取這個(gè)互斥量。
如果某資源同時(shí)只準(zhǔn)一個(gè)任務(wù)訪問(wèn),可以用互斥量保護(hù)這個(gè)資源。
這個(gè)資源一定是存在的,所以創(chuàng)建互斥量時(shí)會(huì)先釋放一個(gè)互斥量,表示這個(gè)資源可以使用。
任務(wù)想訪問(wèn)資源時(shí),先獲取互斥量,等使用完資源后,再釋放它。
也就是說(shuō)互斥量一旦創(chuàng)建好后,要先獲取,后釋放,要在同一個(gè)任務(wù)中獲取和釋放。
這也是互斥量和二進(jìn)制信號(hào)量的一個(gè)重要區(qū)別,二進(jìn)制信號(hào)量可以在隨便一個(gè)任務(wù)中獲取或釋放,然后也可以在任意一個(gè)任務(wù)中釋放或獲取。
「互斥量不同于二進(jìn)制信號(hào)量的還有」:互斥量具有優(yōu)先級(jí)繼承機(jī)制,二進(jìn)制信號(hào)量沒(méi)有,互斥量不可以用于中斷服務(wù)程序,二進(jìn)制信號(hào)量可以。
初始化后的互斥量?jī)?nèi)存如圖1-3所示。
圖1-3:初始化后的互斥量對(duì)象內(nèi)存

1.4創(chuàng)建遞歸互斥量

創(chuàng)建遞歸互斥量間接使用通用隊(duì)列創(chuàng)建函數(shù)xQueueGenericCreate()。創(chuàng)建遞歸互斥量API接口同樣是個(gè)宏,定義如下:
#definexSemaphoreCreateRecursiveMutex()                 \
xQueueCreateMutex(queueQUEUE_TYPE_RECURSIVE_MUTEX, NULL )
其中,宏queueQUEUE_TYPE_RECURSIVE_MUTEX用于通用隊(duì)列創(chuàng)建函數(shù),表示創(chuàng)建隊(duì)列的類型是遞歸互斥量,在文章《FreeRTOS高級(jí)篇5---FreeRTOS隊(duì)列分析》關(guān)于通用隊(duì)列創(chuàng)建函數(shù)參數(shù)說(shuō)明中提到了這個(gè)宏。
創(chuàng)建互斥量和創(chuàng)建遞歸互斥量是調(diào)用的同一個(gè)函數(shù)xQueueCreateMutex();
至于參數(shù)queueQUEUE_TYPE_RECURSIVE_MUTEX,我們?cè)贔reeRTOS一文中已經(jīng)知道,它只是用于可視化調(diào)試;
因此創(chuàng)建互斥量和創(chuàng)建遞歸互斥量可以看作是一樣的,初始化后的遞歸互斥量對(duì)象內(nèi)存也和互斥量一樣,如圖1-3所示。

2.釋放信號(hào)量

無(wú)論二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量還是互斥量,它們都使用相同的獲取和釋放API函數(shù)。釋放信號(hào)量用于使信號(hào)量有效,分為不帶中斷保護(hù)和帶中斷保護(hù)兩個(gè)版本。

2.1 xSemaphoreGive()

用于釋放一個(gè)信號(hào)量,不帶中斷保護(hù)。被釋放的信號(hào)量可以是二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量和互斥量。
注意遞歸互斥量并不能使用這個(gè)API函數(shù)釋放。其實(shí)信號(hào)量釋放是一個(gè)宏,真正調(diào)用的函數(shù)是xQueueGenericSend(),宏定義如下:
#definexSemaphoreGive( xSemaphore )                    \
xQueueGenericSend(                       \
( QueueHandle_t ) ( xSemaphore ), \
NULL,                \
semGIVE_BLOCK_TIME,  \
queueSEND_TO_BACK )
可以看出釋放信號(hào)量實(shí)際上是一次入隊(duì)操作,并且阻塞時(shí)間為0(由宏semGIVE_BLOCK_TIME定義)。
對(duì)于二進(jìn)制信號(hào)量和計(jì)數(shù)信號(hào)量,根據(jù)上一章的內(nèi)容可以總結(jié)出,釋放一個(gè)信號(hào)量的過(guò)程實(shí)際上可以簡(jiǎn)化為兩種情況:
「第一」,如果隊(duì)列未滿,隊(duì)列結(jié)構(gòu)體成員uxMessageWaiting加1,判斷是否有阻塞的任務(wù),有的話解除阻塞,然后返回成功信息(pdPASS);
「第二」,如果隊(duì)列滿,返回錯(cuò)誤代碼(err_QUEUE_FULL),表示隊(duì)列滿。
對(duì)于互斥量要復(fù)雜些,因?yàn)榛コ饬烤哂袃?yōu)先級(jí)繼承機(jī)制。
「優(yōu)先級(jí)繼承是個(gè)什么過(guò)程呢?」
我們舉個(gè)例子。某個(gè)資源X同時(shí)只能有一個(gè)任務(wù)訪問(wèn),現(xiàn)在有任務(wù)A和任務(wù)C都要訪問(wèn)這個(gè)資源,任務(wù)A的優(yōu)先級(jí)為1,任務(wù)C的優(yōu)先級(jí)為10,所以任務(wù)C的優(yōu)先級(jí)大于任務(wù)A的優(yōu)先級(jí)。
我們用互斥量保護(hù)資源X,并且當(dāng)前任務(wù)A正在訪問(wèn)資源X。
在任務(wù)A訪問(wèn)資源X的過(guò)程中,來(lái)了一個(gè)中斷,中斷事件使得任務(wù)C執(zhí)行。
任務(wù)C執(zhí)行的過(guò)程中,也想訪問(wèn)資源X,但是因?yàn)橘Y源X還被任務(wù)A獨(dú)占著,所以任務(wù)C無(wú)法獲取互斥量,會(huì)進(jìn)入阻塞狀態(tài)。
此時(shí),低優(yōu)先級(jí)任務(wù)A會(huì)繼承高優(yōu)先級(jí)任務(wù)C的優(yōu)先級(jí),任務(wù)A的優(yōu)先級(jí)臨時(shí)的被提升,優(yōu)先級(jí)變成10。這個(gè)機(jī)制能夠?qū)⒁呀?jīng)發(fā)生的優(yōu)先級(jí)反轉(zhuǎn)影響降低到最小。
「那么什么是優(yōu)先級(jí)反轉(zhuǎn)呢?」
還是看上面的例子,任務(wù)C的優(yōu)先級(jí)高于任務(wù)A,但是任務(wù)C因?yàn)闆](méi)有獲得互斥量而進(jìn)入阻塞,只能等待低優(yōu)先級(jí)的任務(wù)A釋放互斥量后才能運(yùn)行,這種情況就是優(yōu)先級(jí)反轉(zhuǎn)。
「那為什么優(yōu)先級(jí)繼承可以降低優(yōu)先級(jí)反轉(zhuǎn)的影響呢?」
還是看上面的例子,不過(guò)我們?cè)僭黾右粋€(gè)優(yōu)先級(jí)為5的任務(wù)B,這三個(gè)任務(wù)都處于就緒狀態(tài)。
如果沒(méi)有優(yōu)先級(jí)繼承機(jī)制,三個(gè)任務(wù)的優(yōu)先級(jí)順序?yàn)槿蝿?wù)C>任務(wù)B>任務(wù)A。
當(dāng)任務(wù)C因?yàn)榈貌坏交コ饬慷枞?,任?wù)B會(huì)獲取CPU權(quán)限,等到任務(wù)B主動(dòng)或被動(dòng)讓出CPU后,任務(wù)A才會(huì)執(zhí)行,任務(wù)A釋放互斥量后,任務(wù)C才能得到運(yùn)行。
再看一下有優(yōu)先級(jí)繼承的情況,當(dāng)任務(wù)C因?yàn)榈貌坏交コ饬慷枞?,任?wù)A繼承任務(wù)C的優(yōu)先級(jí),現(xiàn)在三個(gè)任務(wù)的優(yōu)先級(jí)順序?yàn)槿蝿?wù)C=任務(wù)A>任務(wù)B。
當(dāng)任務(wù)C因?yàn)榈貌坏交コ饬慷枞?,任?wù)A會(huì)獲得CPU權(quán)限,等到任務(wù)A釋放互斥量后,任務(wù)C就會(huì)得到運(yùn)行。看,任務(wù)C等待的時(shí)間變短了。
有了上面的基礎(chǔ)理論,我們就很好理解為什么釋放互斥量會(huì)比較復(fù)雜了。
「還是可以簡(jiǎn)化為兩種情況:」
「第一」,如果隊(duì)列未滿,除了隊(duì)列結(jié)構(gòu)體成員uxMessageWaiting加1外,還要判斷獲取互斥量的任務(wù)是否有優(yōu)先級(jí)繼承,如果有的話,還要將任務(wù)的優(yōu)先級(jí)恢復(fù)到原始值。當(dāng)然,恢復(fù)到原來(lái)值也是有條件的,就是該任務(wù)必須在沒(méi)有使用其它互斥量的情況下,才能將繼承的優(yōu)先級(jí)恢復(fù)到原始值。然后判斷是否有阻塞的任務(wù),有的話解除阻塞,最后返回成功信息(pdPASS);
「第二」,如果如果隊(duì)列滿,返回錯(cuò)誤代碼(err_QUEUE_FULL),表示隊(duì)列滿。

2.2xSemaphoreGiveFromISR()

用于釋放一個(gè)信號(hào)量,帶中斷保護(hù)。被釋放的信號(hào)量可以是二進(jìn)制信號(hào)量和計(jì)數(shù)信號(hào)量。
和普通版本的釋放信號(hào)量API函數(shù)不同,它不能釋放互斥量,這是因?yàn)榛コ饬坎豢梢栽谥袛嘀惺褂茫?br /> 互斥量的優(yōu)先級(jí)繼承機(jī)制只能在任務(wù)中起作用,在中斷中毫無(wú)意義。帶中斷保護(hù)的信號(hào)量釋放其實(shí)也是一個(gè)宏,真正調(diào)用的函數(shù)是xQueueGiveFromISR (),宏定義如下:
#definexSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )     \
xQueueGiveFromISR(                     \
( QueueHandle_t ) ( xSemaphore),  \
( pxHigherPriorityTaskWoken ) )
我們看真正被調(diào)用的函數(shù)源碼(經(jīng)過(guò)整理后的):
BaseType_t xQueueGiveFromISR(
QueueHandle_t xQueue,
BaseType_t * constpxHigherPriorityTaskWoken )
{
BaseType_t xReturn;
UBaseType_t uxSavedInterruptStatus;
Queue_t * const pxQueue = ( Queue_t * ) xQueue;
uxSavedInterruptStatus =portSET_INTERRUPT_MASK_FROM_ISR();
{
/*當(dāng)隊(duì)列用于實(shí)現(xiàn)信號(hào)量時(shí),永遠(yuǎn)不會(huì)有數(shù)據(jù)出入隊(duì)列,但是任然要檢查隊(duì)列是否為空 */
if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )
{
/* 一個(gè)任務(wù)可以獲取多個(gè)互斥量,但是只能有一個(gè)繼承優(yōu)先級(jí),如果任務(wù)是互斥量的持有者,則互斥量不允許在中斷服務(wù)程序中釋放.因此這里不需要判斷是否要恢復(fù)任務(wù)的原始優(yōu)先級(jí)值,只是簡(jiǎn)單更新隊(duì)列項(xiàng)計(jì)數(shù)器. */
( pxQueue->uxMessagesWaiting );
/* 如果列表上鎖,不能改變隊(duì)列的事件列表. */
if( pxQueue->xTxLock == queueUNLOCKED )
{
if( listLIST_IS_EMPTY(
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

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

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

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

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

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(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ì)日本游戲市場(chǎng)的投資。

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

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

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

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

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

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

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

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

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

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

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