91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于RTOS任務(wù)間通信和全局變量之間的區(qū)別解析

strongerHuang ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:Mculover666 ? 2021-04-19 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 知識(shí)點(diǎn)回顧

隊(duì)列(queue)是一種只能在一端插入元素、在另一端刪除元素的數(shù)據(jù)結(jié)構(gòu),遵循先入先出(FIFO)的規(guī)則。

環(huán)形隊(duì)列(ring queue)可以方便的重復(fù)利用這段內(nèi)存空間,同樣遵循先入先出(FIFO)的規(guī)則。

優(yōu)先級(jí)隊(duì)列(prio queue)不遵循FIFO,而是根據(jù)元素的優(yōu)先級(jí)進(jìn)行出隊(duì),優(yōu)先級(jí)最高的先出隊(duì)。

「本文的所有內(nèi)容都是基于這兩個(gè)數(shù)據(jù)結(jié)構(gòu)」,TencentOS-tiny中環(huán)形隊(duì)列和優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)和使用示例請(qǐng)閱讀文章:

數(shù)據(jù)結(jié)構(gòu) | TencentOS-tiny中隊(duì)列、環(huán)形隊(duì)列、優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)及使用

2. 消息隊(duì)列

2.1. 什么是消息隊(duì)列

消息隊(duì)列,Message Queue,顧名思義包含兩部分:消息+隊(duì)列,或者可以理解為消息的隊(duì)列。

① 消息是什么?

兩個(gè)不同的任務(wù)之間傳遞數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就稱之為消息,這個(gè)消息可以是一個(gè)整型值,浮點(diǎn)值,甚至一個(gè)結(jié)構(gòu)體,一個(gè)指針……所以,在使用不同的RTOS的消息隊(duì)列時(shí),「一定要注意傳遞的是值還是該值的地址」。

傳遞值的缺點(diǎn)是值的長(zhǎng)度有大有小,導(dǎo)致整個(gè)消息隊(duì)列的長(zhǎng)度有大有小。

一個(gè)指針的長(zhǎng)度是固定的4字節(jié),傳遞值的時(shí)候,無(wú)論值是什么類型,只傳遞該值的地址。

傳遞地址當(dāng)然也有缺陷,當(dāng)動(dòng)態(tài)任務(wù)task1中定義了一個(gè)局部變量,然后把該局部變量的地址傳給了task2,隨即task1因?yàn)槟撤N原因被銷毀,內(nèi)存回收,導(dǎo)致指向該局部變量的指針變?yōu)橐爸羔?,非常危險(xiǎn),不過(guò)不用慌,小問(wèn)題,在編程的時(shí)候注意避免即可。

「在TencentOS-tiny中,消息隊(duì)列中傳遞的消息指的是地址,郵箱隊(duì)列傳遞的消息是值」。

② 隊(duì)列是什么?

消息隊(duì)列如果底層使用環(huán)形隊(duì)列存儲(chǔ)消息,則成為消息隊(duì)列,遵循:先送入的消息先被取出。

消息隊(duì)列如果底層使用優(yōu)先級(jí)隊(duì)列存儲(chǔ)消息,則成為優(yōu)先級(jí)消息隊(duì)列,遵循:優(yōu)先級(jí)最高的消息最先被取出。

「在TencentOS-tiny中,這兩種消息隊(duì)列都有,下面一一講述。」

③ pend-post機(jī)制

無(wú)論是什么隊(duì)列,都存在兩種情況:當(dāng)隊(duì)列滿了的時(shí)候,元素再入隊(duì)會(huì)發(fā)生錯(cuò)誤;當(dāng)隊(duì)列為空的時(shí)候,元素出隊(duì)同樣會(huì)發(fā)生錯(cuò)誤。

這種問(wèn)題可以巧妙的在隊(duì)列基礎(chǔ)之上用pend-post機(jī)制解決,即等待-釋放機(jī)制。

當(dāng)隊(duì)列「滿了」的時(shí)候,前來(lái)入隊(duì)的task1可以選擇pend一段時(shí)間或者永久等待,「一旦有元素被task2出隊(duì)」,調(diào)用post釋放一個(gè)信號(hào),「喚醒等待中的task1」。

同樣,當(dāng)隊(duì)列「空了」的時(shí)候,前來(lái)出隊(duì)的task1可以選擇pend一段時(shí)間或者永久等待,「一旦有元素被task2入隊(duì)」,調(diào)用post釋放一個(gè)信號(hào),「喚醒等待中的task1」。

是不是很巧妙?

接下來(lái)上源碼!上Demo!一看便知~

2.2. 消息隊(duì)列的實(shí)現(xiàn)

TencentOS-tiny中消息隊(duì)列的實(shí)現(xiàn)在 tos_message_queue.h和tos_message_queue.c中。

typedef struct k_message_queue_st {

knl_obj_t knl_obj;

pend_obj_t pend_obj;

k_ring_q_t ring_q;

} k_msg_q_t;

一個(gè)pend_obj對(duì)象用來(lái)實(shí)現(xiàn)pend-post機(jī)制,一個(gè)ring_q環(huán)形隊(duì)列用來(lái)存儲(chǔ)消息。

是不是和我講述的沒(méi)錯(cuò)?學(xué)透了之后,其實(shí)一切都沒(méi)有那么神秘的~

再來(lái)看看從消息隊(duì)列中獲取消息的API實(shí)現(xiàn):

__API__ k_err_t tos_msg_q_pend(k_msg_q_t *msg_q, void **msg_ptr, k_tick_t timeout)

{

//省略了部分源碼

TOS_CPU_INT_DISABLE();

if (tos_ring_q_dequeue(&msg_q-》ring_q, msg_ptr, K_NULL) == K_ERR_NONE) {

TOS_CPU_INT_ENABLE();

return K_ERR_NONE;

}

pend_task_block(k_curr_task, &msg_q-》pend_obj, timeout);

TOS_CPU_INT_ENABLE();

knl_sched();

return err;

}

向消息隊(duì)列中存放消息的API實(shí)現(xiàn)如下:

__STATIC__ k_err_t msg_q_do_post(k_msg_q_t *msg_q, void *msg_ptr, opt_post_t opt)

{

//省略了部分源碼

TOS_CPU_INT_DISABLE();

if (pend_is_nopending(&msg_q-》pend_obj)) {

err = tos_ring_q_enqueue(&msg_q-》ring_q, &msg_ptr, sizeof(void*));

if (err != K_ERR_NONE) {

TOS_CPU_INT_ENABLE();

return err;

}

TOS_CPU_INT_ENABLE();

return K_ERR_NONE;

}

if (opt == OPT_POST_ONE) {

msg_q_task_recv(TOS_LIST_FIRST_ENTRY(&msg_q-》pend_obj.list, k_task_t, pend_list), msg_ptr);

} else { // OPT_POST_ALL

TOS_LIST_FOR_EACH_ENTRY_SAFE(task, tmp, k_task_t, pend_list, &msg_q-》pend_obj.list) {

msg_q_task_recv(task, msg_ptr);

}

}

TOS_CPU_INT_ENABLE();

knl_sched();

return K_ERR_NONE;

}

從源碼中可以看到,如果opt標(biāo)志為 OPT_POST_ONE,表示喚醒一個(gè),則喚醒該消息隊(duì)列等待列表上任務(wù)優(yōu)先級(jí)最高的那個(gè);如果opt標(biāo)志為 OPT_POST_ALL,則全部喚醒。

2.3. 消息隊(duì)列的使用示例

#define MESSAGE_MAX 10

uint8_t msg_pool[MESSAGE_MAX * sizeof(void *)];

k_msg_q_t msg_q;

void entry_task_receiver(void *arg)

{

k_err_t err;

void *msg_received;

while (K_TRUE) {

err = tos_msg_q_pend(&msg_q, &msg_received, TOS_TIME_FOREVER);

if (err == K_ERR_NONE) {

printf(“receiver: msg incoming[%s]

”, (char *)msg_received);

}

}

}

void entry_task_sender(void *arg)

{

char *msg_prio_0 = “msg 0 without priority”;

char *msg_prio_1 = “msg 1 without priority”;

char *msg_prio_2 = “msg 2 without priority”;

printf(“sender: post a message 2 without priority

”);

tos_msg_q_post(&msg_q, msg_prio_2);

printf(“sender: post a message 1 without priority

”);

tos_msg_q_post(&msg_q, msg_prio_1);

printf(“sender: post a message 0 without priority

”);

tos_msg_q_post(&msg_q, msg_prio_0);

}

執(zhí)行結(jié)果如下:

TencentOS-tiny Port on STM32L431RCT6 By Mculover666

sender: post a message 2 without priority

sender: post a message 1 without priority

sender: post a message 0 without priority

receiver: msg incoming[msg 2 without priority]

receiver: msg incoming[msg 1 without priority]

receiver: msg incoming[msg 0 without priority]

3. 優(yōu)先級(jí)消息隊(duì)列3.1. 優(yōu)先級(jí)消息隊(duì)列的實(shí)現(xiàn)

實(shí)現(xiàn)和消息隊(duì)列類似,通過(guò)在優(yōu)先級(jí)隊(duì)列的基礎(chǔ)上加上pend-post機(jī)制來(lái)實(shí)現(xiàn)。

TencentOS-tiny中優(yōu)先級(jí)消息隊(duì)列的實(shí)現(xiàn)在tos_priority_message_queue.h和tos_priority_message_queue.c中。

typedef struct k_priority_message_queue_st {

knl_obj_t knl_obj;

pend_obj_t pend_obj;

void *prio_q_mgr_array;

k_prio_q_t prio_q;

} k_prio_msg_q_t;

其中pend_obj用于掛載等待該優(yōu)先級(jí)消息隊(duì)列的任務(wù),prio_q和prio_q_mgr_array合起來(lái)實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列。

消息入隊(duì)和消息出隊(duì)的API實(shí)現(xiàn)與消息隊(duì)列的實(shí)現(xiàn)思想一模一樣,這里不再講解。

3.2. 優(yōu)先級(jí)消息隊(duì)列的使用示例

#define MESSAGE_MAX 10

uint8_t msg_pool[MESSAGE_MAX * sizeof(void *)];

k_prio_msg_q_t prio_msg_q;

void entry_task_receiver(void *arg)

{

k_err_t err;

void *msg_received;

while (K_TRUE) {

err = tos_prio_msg_q_pend(&prio_msg_q, &msg_received, TOS_TIME_FOREVER);

if (err == K_ERR_NONE) {

printf(“receiver: msg incoming[%s]

”, (char *)msg_received);

}

}

}

void entry_task_sender(void *arg)

{

char *msg_prio_0 = “msg with priority 0”;

char *msg_prio_1 = “msg with priority 1”;

char *msg_prio_2 = “msg with priority 2”;

printf(“sender: post a message with priority 2

”);

tos_prio_msg_q_post(&prio_msg_q, msg_prio_2, 2);

printf(“sender: post a message with priority 1

”);

tos_prio_msg_q_post(&prio_msg_q, msg_prio_1, 1);

printf(“sender: post a message with priority 0

”);

tos_prio_msg_q_post(&prio_msg_q, msg_prio_0, 0);

}

運(yùn)行結(jié)果如下:

TencentOS-tiny Port on STM32L431RCT6 By Mculover666

sender: post a message with priority 2

sender: post a message with priority 1

sender: post a message with priority 0

receiver: msg incoming[msg with priority 0]

receiver: msg incoming[msg with priority 1]

receiver: msg incoming[msg with priority 2]

?

將第2節(jié)的結(jié)果和第3節(jié)的結(jié)果對(duì)比,就會(huì)發(fā)現(xiàn)同樣的消息發(fā)送順序,因?yàn)槭褂貌煌南㈥?duì)列,任務(wù)獲取到的消息順序截然不同。

4. 郵箱隊(duì)列

4.1. 不同之處

消息隊(duì)列和郵箱隊(duì)列的不同之處,在于底層隊(duì)列每個(gè)元素類型不一樣,看一眼源碼便知。

消息隊(duì)列傳遞的消息是地址,所以在初始化消息隊(duì)列的時(shí)候,環(huán)形隊(duì)列中每個(gè)元素都是空指針類型:

__API__ k_err_t tos_msg_q_create(k_msg_q_t *msg_q, void *pool, size_t msg_cnt)

{

//部分源碼省略

//重點(diǎn):隊(duì)列中每個(gè)元素類型大小是sizeof(void*)

err = tos_ring_q_create(&msg_q-》ring_q, pool, msg_cnt, sizeof(void *));

if (err != K_ERR_NONE) {

return err;

}

return K_ERR_NONE;

}

而郵箱隊(duì)列傳遞的是值,所以在初始化底層用到的環(huán)形隊(duì)列時(shí),每個(gè)元素的大小是由用戶指定的:

__API__ k_err_t tos_mail_q_create(k_mail_q_t *mail_q, void *pool, size_t mail_cnt, size_t mail_size)

{

//省略了部分源碼

//重點(diǎn):每個(gè)元素的大小是mail_size,由用戶傳入?yún)?shù)指定

err = tos_ring_q_create(&mail_q-》ring_q, pool, mail_cnt, mail_size);

if (err != K_ERR_NONE) {

return err;

}

return K_ERR_NONE;

}

4.2. 郵箱隊(duì)列的實(shí)現(xiàn)

這有什么好實(shí)現(xiàn)的~一個(gè)環(huán)形隊(duì)列+pend-post對(duì)象即可。

TencentOS-tiny中郵箱隊(duì)列的實(shí)現(xiàn)在tos_mail_queue.h和tos_mail_queue.c中。

typedef struct k_mail_queue_st {

knl_obj_t knl_obj;

pend_obj_t pend_obj;

k_ring_q_t ring_q;

} k_mail_q_t;

是不是沒(méi)什么區(qū)別~至于操作的API,更沒(méi)啥區(qū)別,不寫了,劃水劃水。

4.3. 郵箱隊(duì)列的使用示例

#define MAIL_MAX 10

typedef struct mail_st {

char *message;

int payload;

} mail_t;

uint8_t mail_pool[MAIL_MAX * sizeof(mail_t)];

k_mail_q_t mail_q;

void entry_task_receiver_higher_prio(void *arg)

{

k_err_t err;

mail_t mail;

size_t mail_size;

while (K_TRUE) {

err = tos_mail_q_pend(&mail_q, &mail, &mail_size, TOS_TIME_FOREVER);

if (err == K_ERR_NONE) {

TOS_ASSERT(mail_size == sizeof(mail_t));

printf(“higher: msg incoming[%s], payload[%d]

”, mail.message, mail.payload);

}

}

}

void entry_task_receiver_lower_prio(void *arg)

{

k_err_t err;

mail_t mail;

size_t mail_size;

while (K_TRUE) {

err = tos_mail_q_pend(&mail_q, &mail, &mail_size, TOS_TIME_FOREVER);

if (err == K_ERR_NONE) {

TOS_ASSERT(mail_size == sizeof(mail_t));

printf(“l(fā)ower: msg incoming[%s], payload[%d]

”, mail.message, mail.payload);

}

}

}

void entry_task_sender(void *arg)

{

int i = 1;

mail_t mail;

while (K_TRUE) {

if (i == 2) {

printf(“sender: send a mail to one receiver, and shoud be the highest priority one

”);

mail.message = “1st time post”;

mail.payload = 1;

tos_mail_q_post(&mail_q, &mail, sizeof(mail_t));

}

if (i == 3) {

printf(“sender: send a message to all recevier

”);

mail.message = “2nd time post”;

mail.payload = 2;

tos_mail_q_post_all(&mail_q, &mail, sizeof(mail_t));

}

if (i == 4) {

printf(“sender: send a message to one receiver, and shoud be the highest priority one

”);

mail.message = “3rd time post”;

mail.payload = 3;

tos_mail_q_post(&mail_q, &mail, sizeof(mail_t));

}

if (i == 5) {

printf(“sender: send a message to all recevier

”);

mail.message = “4th time post”;

mail.payload = 4;

tos_mail_q_post_all(&mail_q, &mail, sizeof(mail_t));

}

tos_task_delay(1000);

++i;

}

}

運(yùn)行結(jié)果為:

TencentOS-tiny Port on STM32L431RCT6 By Mculover666

sender: send a mail to one receiver, and shoud be the highest priority one

higher: msg incoming[1st time post], payload[1]

sender: send a message to all recevier

higher: msg incoming[2nd time post], payload[2]

lower: msg incoming[2nd time post], payload[2]

sender: send a message to one receiver, and shoud be the highest priority one

higher: msg incoming[3rd time post], payload[3]

sender: send a message to all recevier

higher: msg incoming[4th time post], payload[4]

lower: msg incoming[4th time post], payload[4]

此示例主要演示了兩點(diǎn):1. 如何使用郵箱隊(duì)列直接傳遞值;2. 喚醒一個(gè)等待任務(wù)和喚醒所有等待任務(wù)的區(qū)別。

5. 優(yōu)先級(jí)郵箱隊(duì)列

看到這里,這個(gè)不能再講了吧~

TencentOS-tiny中實(shí)現(xiàn)在tos_priority_mail_queue.c 和tos_priority_mail_queue.h中。

可以自己嘗試根據(jù)前面的demo,編寫出一個(gè)使用優(yōu)先級(jí)郵箱隊(duì)列的demo,測(cè)試高優(yōu)先級(jí)的郵件是否會(huì)被先收到,然后將結(jié)果與第4節(jié)的實(shí)驗(yàn)結(jié)果進(jìn)行對(duì)比。

越到文末我越浪,劃水已經(jīng)不能滿足了,博主要去摸魚~

6. 總結(jié)

按照慣例,對(duì)本文所講的內(nèi)容進(jìn)行一個(gè)總結(jié)。

本文主要講述了用于任務(wù)間通信的一些內(nèi)核對(duì)象,主要有四個(gè):消息隊(duì)列和優(yōu)先級(jí)消息隊(duì)列,郵箱隊(duì)列和優(yōu)先級(jí)郵箱隊(duì)列。

接下來(lái)列出一些重要的點(diǎn):

① 「在使用RTOS中的一些用于任務(wù)間通信的量時(shí),要注意傳遞的是值還是地址。TencentOS-tiny中消息隊(duì)列傳輸?shù)氖堑刂?,而郵箱隊(duì)列傳遞的是值?!?/p>

② 「消息隊(duì)列和郵箱隊(duì)列基于環(huán)形隊(duì)列實(shí)現(xiàn),遵循FIFO規(guī)則;而優(yōu)先級(jí)消息隊(duì)列和優(yōu)先級(jí)郵箱隊(duì)列基于優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn),遵循按照元素優(yōu)先級(jí)取出的規(guī)則?!?/p>

最后來(lái)回答題目中的問(wèn)題:任務(wù)間通信為什么不使用全局變量?

① 無(wú)論是消息隊(duì)列還是郵箱隊(duì)列,都是利用了全局變量可以被隨意訪問(wèn)的特性,所以使用時(shí)都會(huì)被定義為全局變量。

② 普通全局變量可用于一些簡(jiǎn)單的任務(wù)間通信場(chǎng)合。

③ 相較于普通全局變量,加入隊(duì)列機(jī)制可以存儲(chǔ)多個(gè)消息,加入pend-post機(jī)制可以擁有任務(wù)等待和喚醒的機(jī)制,用于解決隊(duì)列已滿或隊(duì)列為空的問(wèn)題。
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    407

    瀏覽量

    45767
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    866

    瀏覽量

    123068
  • 消息隊(duì)列
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    3283

原文標(biāo)題:RTOS任務(wù)間通信和全局變量有什么區(qū)別?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式C語(yǔ)言中各變量存儲(chǔ)位置

    局部變量、局部靜態(tài)變量、全局變量、全局靜態(tài)變量區(qū)別如下: 局部
    發(fā)表于 12-25 07:54

    通信延時(shí),都做到這么低了?附:各項(xiàng)完整測(cè)試數(shù)據(jù)

    先說(shuō)說(shuō),為什么核通信延時(shí)能逼瘋工程師?咱做工業(yè)控制的都知道,多核處理器就像車間里的多個(gè)師傅,例如瑞芯微RK3576處理器: A72核當(dāng)領(lǐng)導(dǎo)管全局 (跑Linux,人機(jī)交互、數(shù)據(jù)處理), A53核當(dāng)
    的頭像 發(fā)表于 12-24 16:36 ?220次閱讀
    核<b class='flag-5'>間</b><b class='flag-5'>通信</b>延時(shí),都做到這么低了?附:各項(xiàng)完整測(cè)試數(shù)據(jù)

    使用RTOS時(shí)需要注意的幾點(diǎn)內(nèi)容分享

    是不可能的。不過(guò),整個(gè)芯片上有足夠空間安裝一個(gè)操作環(huán)境的特定部分。同樣,適于該平臺(tái)的應(yīng)用常常是特定的。于是,由于硬件可處理內(nèi)核之間通信任務(wù)調(diào)度,因此RTOS類的支持并不需要。 資源
    發(fā)表于 12-23 06:34

    如何搞定嵌入式 C語(yǔ)言中的全局變量問(wèn)題?

    大家好,今天分享一篇關(guān)于嵌入式C編程中全局變量問(wèn)題的文章。希望對(duì)大家有所啟發(fā)。 嵌入式特別是單片機(jī)os-less的程序,最易范的錯(cuò)誤是全局變量滿天飛。 這個(gè)現(xiàn)象在早期匯編轉(zhuǎn)型過(guò)來(lái)的程序員以及初學(xué)者
    發(fā)表于 12-16 06:54

    C語(yǔ)言全局變量重點(diǎn)使用

    全局變量絕不會(huì)位于寄存器中。使用指針或者函數(shù)調(diào)用,可以直接修改全局變量的值。 因此,編譯器不能將全局變量的值緩存在寄存器中,但這在使用全局變量時(shí)便需要額外的 (常常是不必要的)讀取和存
    發(fā)表于 12-12 06:58

    第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)

    知識(shí)——變量的作用域和存儲(chǔ)類別。 7.1變量的作用域 所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為局部
    的頭像 發(fā)表于 12-10 16:25 ?373次閱讀

    看懂C語(yǔ)言程序中的內(nèi)聚和耦合

    ,稱為特征耦合,在這里,使函數(shù)之間產(chǎn)生聯(lián)系的是地址這樣的特征標(biāo)識(shí)。另外,有兩個(gè)函數(shù)可能會(huì)打開同一個(gè)文件進(jìn)行操作,這也構(gòu)成了特征耦合的一種形式。 更強(qiáng)的耦合是外部耦合,這里,一組模塊都訪問(wèn)同一全局變量
    發(fā)表于 12-08 06:37

    請(qǐng)問(wèn)C語(yǔ)言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量的形式?

    C語(yǔ)言代碼,大多數(shù)都是使用全局變量,也就是用很多函數(shù)來(lái)操作這些變量,比如函數(shù)1把一個(gè)全局變量經(jīng)過(guò)一系列復(fù)雜的算法計(jì)算后改變了這個(gè)全局變量的值,然后函數(shù)2再拿著函數(shù)1處理過(guò)的這個(gè)
    發(fā)表于 12-04 07:47

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局變量上,和非靜態(tài)全局變量相比,
    發(fā)表于 11-21 07:05

    RTOS 必學(xué)概念:任務(wù)、信號(hào)量、隊(duì)列一次搞懂

    如果你剛接觸RTOS(實(shí)時(shí)操作系統(tǒng)),很可能會(huì)有這樣的困惑:“RTOS和裸機(jī)程序到底有什么區(qū)別?”“任務(wù)是線程嗎?為什么要分任務(wù)?”“信號(hào)量
    的頭像 發(fā)表于 11-17 10:53 ?502次閱讀
    <b class='flag-5'>RTOS</b> 必學(xué)概念:<b class='flag-5'>任務(wù)</b>、信號(hào)量、隊(duì)列一次搞懂

    freertos關(guān)閉任務(wù)調(diào)度的方法

    disable_task_scheduling() { vTaskSuspendAll();// 關(guān)閉調(diào)度器 /* 在這里執(zhí)行需要原子操作的代碼,例如修改全局變量 */ /* 重新啟用調(diào)度器
    發(fā)表于 11-17 06:47

    C語(yǔ)言開發(fā)單片機(jī)為什么大多數(shù)都采用全局變量的形式?

    單片機(jī)的芯片資源從來(lái)都是 “精打細(xì)算” 的級(jí)別,CPU 主頻普遍不高,RAM 總?cè)萘勘揪途o張,分給??臻g的更是少得可憐。要是像普通軟件那樣,依賴函數(shù)返回值傳遞數(shù)據(jù)、頻繁用局部變量周轉(zhuǎn),一來(lái)二去占用
    的頭像 發(fā)表于 11-12 14:29 ?446次閱讀
    C語(yǔ)言開發(fā)單片機(jī)為什么大多數(shù)都采用<b class='flag-5'>全局變量</b>的形式?

    PLC中Static和Temp變量區(qū)別

    大家好,收到粉絲投稿,讓博主講下Static變量和Temp變量區(qū)別,新入行的兄弟可能會(huì)對(duì)這兩個(gè)概念不太能理解。
    的頭像 發(fā)表于 09-24 14:51 ?1433次閱讀
    PLC中Static和Temp<b class='flag-5'>變量</b>的<b class='flag-5'>區(qū)別</b>

    請(qǐng)問(wèn)Modus Toolbox下針對(duì)CYW20719B2編程,能否指定全局變量地址?

    請(qǐng)問(wèn)Modus Toolbox 下針對(duì)CYW20719B2編程,能否指定全局變量地址?
    發(fā)表于 07-08 07:20

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過(guò)該函數(shù),用戶可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?1098次閱讀