国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32+Clion多線程開發(fā)

這篇具有很好參考價值的文章主要介紹了STM32+Clion多線程開發(fā)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

創(chuàng)建多線程

freertos.c

main.cpp

main_app.h

二值信號量

相關API介紹

(1) osSemaphoreCreate

(2)osSemaphoreDelete

(3)osSemaphoreRelease

(4)osSemaphoreWait

實際使用

創(chuàng)建信號量(freertos.c)

在頭文件中外部引用(freertos_inc.h)

main.c

關于clion使用printf,參考【教程】手把手教你用Clion進行STM32開發(fā)【如何優(yōu)雅の進行嵌入式開發(fā)】 - 知乎 (zhihu.com)


創(chuàng)建多線程

本文的程序通過STM32CubeMX+Clion完成,使用單片機為Stm32f411CEU6

為了讓自己的程序和生成的程序分開,方便后續(xù)的管理,我我們可以新建一個Src目錄或者User目錄,然后在目錄里新建main_app.cpp/main_app.h,如果有其他傳感器功能的實現(xiàn)或者算法的實現(xiàn)可以再新建一個目錄放到里面,新加的目錄記得在CMakelist里添加路徑。

STM32+Clion多線程開發(fā),stm32,嵌入式硬件,單片機,c++,c語言

在include和file里都要添加,尤其是file,不添加也不會報錯容易漏。

STM32+Clion多線程開發(fā),stm32,嵌入式硬件,單片機,c++,c語言

然后要知道程序是在哪里運行的,不在main.c中而是在下面這個文件里core/src/freertos.c,在這里寫上自己的主程序函數(shù)就可以成功進入

freertos.c
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */

    main_app();
    vTaskDelete(defaultTaskHandle);


  /* USER CODE END StartDefaultTask */
}

接下來創(chuàng)建第一個線程,這里使用cmsis_os.h,記得包含到頭文件里,然后按照以下格式創(chuàng)建即可,要注意的就是設置的棧大小和優(yōu)先級,還有這個任務main_app執(zhí)行完后就結(jié)束了,所以后續(xù)需要使用的變量或者類,不要放到函數(shù)中而是要放在前面,創(chuàng)建全局變量并初始化。

main.cpp
SensorManager sensorManager;//全局變量,記得初始化,在這里直接初始化也可以

osThreadId_t SensorTaskHandle;
void SensorTask(void *pvParameters) {
    for(;;) {
        LED_B_TogglePin;
        osDelay(1000);
    }
}

osThreadId_t LCDTaskHandle;
void LCDTask(void *pvParameters) {
    for(;;) {
        LED_R_TogglePin;
        osDelay(1000);
    }
}

void main_app()
{

    const osThreadAttr_t SensorTask_attributes = {
            .name = "SensorTask",
            .stack_size = 128 * 8,//??臻g
            .priority = (osPriority_t) osPriorityNormal,
    };
    SensorTaskHandle = osThreadNew(SensorTask, nullptr, &SensorTask_attributes);

    const osThreadAttr_t LCDTask_attributes = {
            .name = "LCDTask",
            .stack_size = 128 * 8,
            .priority = (osPriority_t) osPriorityNormal,
    };
    LCDTaskHandle = osThreadNew(LCDTask, nullptr, &LCDTask_attributes);


    // 啟動調(diào)度器
    printf("end\n");
}
main_app.h
#ifndef STM32_DEMO2_F4_MAIN_APP_H
#define STM32_DEMO2_F4_MAIN_APP_H

#ifdef __cplusplus
extern "C" {
#endif

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

#include "cmsis_os.h"
#include "main.h"
#include "gpio.h"
#include "usart.h"


void main_app(void);

#ifdef __cplusplus
}

#endif

#endif //STM32_DEMO2_F4_MAIN_APP_H

二值信號量

在多線程時當多個線程同時訪問一個變量時,可能會造成沖突,比如當兩個線程同時使用printf時,出現(xiàn)沖突,結(jié)果就是打印亂碼,因此需要使用信號量來避免這種情況,在使用串口的問題中,我使用二值信號量。

相關API介紹

(1) osSemaphoreCreate

用于創(chuàng)建一個二值信號量,并返回一個ID。

函數(shù) osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count)

參數(shù) semaphore_def: 引用由osSemaphoreDef定義的信號量 count: 信號量數(shù)量

返回值 成功返回信號量ID,失敗返回0

(2)osSemaphoreDelete

用于刪除一個信號量,包括二值信號量,計數(shù)信號量,互斥量和遞歸互斥量。如果有任務阻塞在該信號量上,那么不要刪除該信號量。

函數(shù) osStatus osSemaphoreDelete (osSemaphoreId semaphore_id)

參數(shù) semaphore_id: 信號量ID

返回值 錯誤碼文章來源地址http://www.zghlxwxcb.cn/news/detail-840351.html

(3)osSemaphoreRelease

用于釋放信號量的宏。釋放的信號量對象必須是已經(jīng)被創(chuàng)建的,可以用于二值信號量、計數(shù)信號量、互斥量的釋放,但不能釋放由函數(shù) xSemaphoreCreateRecursiveMutex() 創(chuàng)建的遞歸互斥量??捎迷谥袛喾粘绦蛑?。

函數(shù) osStatus osSemaphoreRelease (osSemaphoreId semaphore_id)

參數(shù) semaphore_id: 信號量ID

返回值 錯誤碼

(4)osSemaphoreWait

用于獲取信號量,不帶中斷保護。獲取的信號量對象可以是二值信號量、計數(shù)信號量和互斥量,但是遞歸互斥量并不能使用這個 API 函數(shù)獲取??捎迷谥袛喾粘绦蛑小?/p>

函數(shù) int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec)

參數(shù) semaphore_id: 信號量ID millisec:等待信號量可用的最大超時時間,單位為 tick(即系統(tǒng)節(jié)拍周期)。 如果宏 INCLUDE_vTaskSuspend 定義為 1 且形參 xTicksToWait 設置為 portMAX_DELAY ,則任務將一直阻塞在該信號量上(即沒有超時時間)

返回值 錯誤碼

實際使用

創(chuàng)建信號量(freertos.c)
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
osSemaphoreId sem_uart6_rx;
osSemaphoreId sem_uart6_tx;
/* USER CODE END PD */

void MX_FREERTOS_Init(void) {
    // Create a semaphore for USB RX, and start with no tokens by removing the starting one.
    osSemaphoreDef(sem_usb_rx);
    sem_uart6_rx = osSemaphoreNew(1, 0, osSemaphore(sem_usb_rx));

    // Create a semaphore for USB TX
    osSemaphoreDef(sem_usb_tx);
    sem_uart6_tx = osSemaphoreNew(1, 1, osSemaphore(sem_usb_tx));
  /* USER CODE END RTOS_SEMAPHORES */

  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

}
在頭文件中外部引用(freertos_inc.h)
#ifndef STM32_DEMO2_F4_FREERTOS_INC_H
#define STM32_DEMO2_F4_FREERTOS_INC_H

#ifdef __cplusplus
extern "C" {
#endif
// List of semaphores
extern osSemaphoreId sem_uart6_rx;
extern osSemaphoreId sem_uart6_tx;

// List of Tasks
/*--------------------------------- System Tasks -------------------------------------*/
extern osThreadId_t defaultTaskHandle;      // Usage: 4000 Bytes stack

/*---------------------------------- User Tasks --------------------------------------*/
extern osThreadId_t SensorTaskHandle;         // Usage: 4000 Bytes stack
extern osThreadId_t LCDTaskHandle;  // Usage: 4000 Bytes stack

/*---------------- 24.1K (used) / 64K (for FreeRTOS) / 128K (total) ------------------*/

#ifdef __cplusplus
}
#endif

#endif //STM32_DEMO2_F4_FREERTOS_INC_H
main.c
osThreadId_t SensorTaskHandle;
void SensorTask(void *pvParameters) {
    osSemaphoreAcquire(sem_uart6_tx,osWaitForever);
    printf("enter SensorTask\n");
    osSemaphoreRelease(sem_uart6_tx);
    for(;;) {
        LED_B_TogglePin;
        osDelay(1000);
    }
}

osThreadId_t LCDTaskHandle;
void LCDTask(void *pvParameters) {
    osSemaphoreAcquire(sem_uart6_tx,osWaitForever);
    printf("enter LCDTask\n");
    osSemaphoreRelease(sem_uart6_tx);
    for(;;) {
        LED_R_TogglePin;
        osDelay(1000);
    }
}

void main_app()
{

    const osThreadAttr_t SensorTask_attributes = {
            .name = "SensorTask",
            .stack_size = 128 * 8,//??臻g
            .priority = (osPriority_t) osPriorityNormal,
    };
    SensorTaskHandle = osThreadNew(SensorTask, nullptr, &SensorTask_attributes);

    const osThreadAttr_t LCDTask_attributes = {
            .name = "LCDTask",
            .stack_size = 128 * 8,
            .priority = (osPriority_t) osPriorityNormal,
    };
    LCDTaskHandle = osThreadNew(LCDTask, nullptr, &LCDTask_attributes);


    // 啟動調(diào)度器
    printf("end\n");
}

關于clion使用printf,參考【教程】手把手教你用Clion進行STM32開發(fā)【如何優(yōu)雅の進行嵌入式開發(fā)】 - 知乎 (zhihu.com)

到了這里,關于STM32+Clion多線程開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 嵌入式畢設分享 stm32人臉識別快遞柜系統(tǒng)(源碼+硬件+論文)

    嵌入式畢設分享 stm32人臉識別快遞柜系統(tǒng)(源碼+硬件+論文)

    ?? 這兩年開始畢業(yè)設計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設,學長分享優(yōu)質(zhì)畢業(yè)設計項目,今天

    2024年04月10日
    瀏覽(149)
  • 嵌入式畢設分享 stm32 RFID智能倉庫管理系統(tǒng)(源碼+硬件+論文)

    嵌入式畢設分享 stm32 RFID智能倉庫管理系統(tǒng)(源碼+硬件+論文)

    ?? 這兩年開始畢業(yè)設計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設,學長分享優(yōu)質(zhì)畢業(yè)設計項目,今天

    2024年02月20日
    瀏覽(96)
  • 嵌入式畢設分享 stm32智能魚缸監(jiān)控投喂系統(tǒng)(源碼+硬件+論文)

    嵌入式畢設分享 stm32智能魚缸監(jiān)控投喂系統(tǒng)(源碼+硬件+論文)

    ?? 這兩年開始畢業(yè)設計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設,學長分享優(yōu)質(zhì)畢業(yè)設計項目,今天

    2024年03月17日
    瀏覽(30)
  • STM32開發(fā)環(huán)境搭建&工程創(chuàng)建(嵌入式學習)

    STM32開發(fā)環(huán)境搭建&工程創(chuàng)建(嵌入式學習)

    簡介 STM32CubeMX是STMicroelectronics公司提供的一款集成開發(fā)環(huán)境(IDE)工具,用于快速配置和初始化STM32微控制器系列的軟件工程。它提供了圖形化界面和交互式工具,使開發(fā)者能夠輕松地生成STM32微控制器的初始化代碼和配置文件。 STM32CubeMX具有以下主要功能和特點: 微控制器

    2024年02月11日
    瀏覽(98)
  • 嵌入式物聯(lián)網(wǎng)STM32實戰(zhàn)開發(fā)代碼例程庫

    幾百個例程清單,CSDN下載地址: https://download.csdn.net/download/weixin_39804904/88671879 開發(fā)例程清單(持續(xù)新增中,歡迎點贊關注): 0001基于STM32F103單片機GPIO實現(xiàn)控制LED燈閃爍的程序代碼0001.rar 0002基于STM32F103單片機GPIO實現(xiàn)按鍵KEY的檢測程序代碼0002.rar 0003基于STM32F103單片機GPIO實現(xiàn)

    2024年02月02日
    瀏覽(94)
  • 嵌入式系統(tǒng)開發(fā)13——STM32輸出PWM實現(xiàn)呼吸燈

    嵌入式系統(tǒng)開發(fā)13——STM32輸出PWM實現(xiàn)呼吸燈

    本文主要介紹在STM32F103C8T6上,利用定時器輸出PWM波形,進而驅(qū)動LED實現(xiàn)呼吸燈。 使用TIM3和TIM4,分別輸出一個PWM波形,PWM的占空比隨時間變化,去驅(qū)動你外接的一個LED以及最小開發(fā)板上已焊接的LED(固定接在 PC13 GPIO端口),實現(xiàn)2個 LED呼吸燈的效果。 脈沖寬度調(diào)制(PWM) ,是

    2023年04月08日
    瀏覽(90)
  • 【STM32嵌入式系統(tǒng)設計與開發(fā)】——7有源蜂鳴器應用

    【STM32嵌入式系統(tǒng)設計與開發(fā)】——7有源蜂鳴器應用

    STM32資料包: 百度網(wǎng)盤下載鏈接:鏈接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888 提取碼:8888 觀察電路圖,核心板PD14連接底板中的P2外接排針,將正負極接上直流電壓即可持續(xù)發(fā)聲,頻率固定。LED的PA0連接底板的D1燈。 步驟1:復制工程模板“1_Template”重命名為“4_Active

    2024年03月21日
    瀏覽(102)
  • 嵌入式系統(tǒng)開發(fā)筆記104:在STM32CubeIDE中導入工程

    嵌入式系統(tǒng)開發(fā)筆記104:在STM32CubeIDE中導入工程

    ??本文講述如何在STM32CubeIDE中導入現(xiàn)有工程。

    2024年02月16日
    瀏覽(89)
  • 嵌入式開發(fā)--STM32G4系列片上FLASH的讀寫

    嵌入式開發(fā)--STM32G4系列片上FLASH的讀寫

    這個玩意吧,說起來很簡單,就是幾行代碼的事,但楞是折騰了我大半天時間才搞定。原因后面說,先看代碼吧: 讀操作很簡單,以32位方式讀取的時候是這樣的: 需要注意的是,當以32位方式讀取時,地址需要是4的整數(shù)倍,即32位。 8位或16位方式類似操作即可 需要注意的

    2024年01月18日
    瀏覽(97)
  • STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

    STM32F4+FreeRTOS+LVGL實現(xiàn)嵌入式快速開發(fā)(縫合怪)

    極速進行項目開發(fā),只需要懂一款芯片架構(gòu)+一個操作系統(tǒng)+一個GUI。各種部件程序全靠抄 ,成為究極縫合怪。本文用stm32f407+FreeRTOS+lvgl演示一些demo。 原文鏈接:STM32F4+FreeRTOS+LVGL實現(xiàn)快速開發(fā)(縫合怪) lvgl官方的音樂播放器demo: 百問網(wǎng)的2048小游戲: STM32F407這款芯片就不多介紹

    2024年02月08日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包