FreeRTOS和UCOS操作系統使用筆記

FreeRTOS使用示例

UCOS使用示例

信號量使用

信號量訪問共享資源區/
OS_SEMMY_SEM; //定義一個信號量,用于訪問共享資源OSSemCreate ((OS_SEM* )&MY_SEM, //創建信號量,指向信號量(CPU_CHAR* )"MY_SEM", //信號量名字(OS_SEM_CTR )1,       //信號量值為1,可以理解開始有個任務就可以請求到信號量(OS_ERR* )&err);//錯誤碼void task1_task(void *p_arg)
{OS_ERR err;u8 task1_str[]="First task Running!";//請求信號量,參數2:0為死等;參數3:表示信號量無效任務掛起等待信號量;參數4:時間戳OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);memcpy(share_resource,task1_str,sizeof(task1_str));//向共享資源區拷貝數據delay_ms(200);printf("%s\r\n",share_resource);       //串口輸出共享資源區數據OSSemPost(&MY_SEM,OS_OPT_POST_1,&err); //發送信號量
}
void task2_task(void *p_arg)
{OS_ERR err;u8 task2_str[]="Second task Running!";OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);  //請求信號量(3)memcpy(share_resource,task2_str,sizeof(task2_str));//向共享資源區拷貝數據delay_ms(200);printf("%s\r\n",share_resource);        //串口輸出共享資源區數據//OS_OPT_POST_1表示向信號量優先級高的任務發送信號量OSSemPost(&MY_SEM,OS_OPT_POST_1,&err);//發送信號量 
}
/信號量用于任務同步實驗
OS_SEM SYNC_SEM; //定義一個信號量,用于任務同步
OSSemCreate ((OS_SEM* )&SYNC_SEM,//創建信號量,指向信號量(CPU_CHAR* )"SYNC_SEM",//信號量名字(OS_SEM_CTR )0,        //信號量值為0(OS_ERR* )&err);       //錯誤碼void task1_task(void *p_arg)
{OS_ERR err;if(KEY_Scan(0)==WKUP_PRES){OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//發送信號量LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0); //顯示信號量值 }
}void task2_task(void *p_arg)
{OS_ERR err;//OS_OPT_PEND_BLOCKING:表示信號量無效任務掛起等待信號量//如是OS_OPT_POST_ALL 向等待該信號量的所有任務發送信號量。OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //請求信號量LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0); //顯示信號量值OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延時1s
}

?內建信號量

//內建信號量///
void task1_task(void *p_arg)
{OS_ERR err;if(KEY_Scan(0) == WKUP_PRES){//OS_OPT_POST_NONE:不指定特定的選項OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);//使用系統內建信號量向任務task2發送信號量LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0); //顯示信號量值}
}void task2_task(void *p_arg)
{OS_ERR err; //參數1:超時時間,0為一直等待信號量;2:信號量被占用則掛起等待;3:時間戳OSTaskSemPend(0,OS_OPT_PEND_BLOCKING, 0,&err);//請求任務內建的信號量LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0);//顯示任務內建信號量值
}

消息傳遞

消息隊列相關函數

消息隊列//
#define KEYMSG_Q_NUM 1 //按鍵消息隊列的數量
#define DATAMSG_Q_NUM 4 //發送數據的消息隊列的數量
OS_Q KEY_Msg; //定義一個消息隊列,用于按鍵消息傳遞,模擬消息郵箱
OS_Q DATA_Msg; //定義一個消息隊列,用于發送數據void start_task(void *p_arg)
{//......OSQCreate ( (OS_Q* )&KEY_Msg,//指向一個消息隊列(CPU_CHAR* )"KEY Msg",//消息隊列名稱(OS_MSG_QTY )KEYMSG_Q_NUM, //消息隊列長度,這里設置為 1(OS_ERR* )&err); //錯誤碼
//創建消息隊列 DATA_MsgOSQCreate ( (OS_Q* )&DATA_Msg, //指向一個消息隊列(CPU_CHAR* )"DATA Msg",//消息隊列的名稱(OS_MSG_QTY )DATAMSG_Q_NUM,//消息隊列的個數這里是4(OS_ERR* )&err);//錯誤碼
}void tmr1_callback(void *p_tmr,void *p_arg)
{//......sprintf((char*)pbuf,"ALIENTEK %d",msg_num);//發送消息OSQPost((OS_Q* )&DATA_Msg,//指向一個消息隊列(void* )pbuf,     //指向要發送的內容void指針(OS_MSG_SIZE )10, //要發送的消息大小,單位字節(OS_OPT )OS_OPT_POST_FIFO,//發送消息操作類型,這里表示發送消息報錯隊列尾部(OS_ERR* )&err);  //錯誤碼	
}void main_task(void *p_arg)
{u8 key = KEY_Scan(0); //掃描按鍵//發送消息OSQPost((OS_Q* )&KEY_Msg,(void* )&key,(OS_MSG_SIZE )1,(OS_OPT )OS_OPT_POST_FIFO,(OS_ERR* &err);u8 msgq_remain_size = DATA_Msg.MsgQ.NbrEntriesSize-DATA_Msg.MsgQ.NbrEntries;//消息隊列剩余大小sprintf((char*)p,"Total Size:%d",DATA_Msg.MsgQ.NbrEntriesSize);//顯示 DATA_Msg 消息隊列總的大小
}void Keyprocess_task(void *p_arg)
{u8 num;u8 *key;OS_MSG_SIZE size;OS_ERR err;key=OSQPend((OS_Q* )&KEY_Msg, //指向一個消息隊列,整個函數反回的是指針消息數據(OS_TICK )0,     //指定時間沒有接收到數據任務就被喚醒,0一直等(OS_OPT )OS_OPT_PEND_BLOCKING,//一直等,直到接收到消息(OS_MSG_SIZE* )&size,//接收消息的字節長度(CPU_TS* )0,//指向一個時間戳(OS_ERR* )&err);//錯誤碼
}
void msgdis_task(void *p_arg)
{u8 *p;OS_MSG_SIZE size;OS_ERR err; p=OSQPend(  (OS_Q* )&DATA_Msg, (OS_TICK )0,(OS_OPT )OS_OPT_PEND_BLOCKING,(OS_MSG_SIZE* )&size;(CPU_TS* )0,(OS_ERR* )&err);LCD_ShowString(5,270,100,16,16,p);
}

?任務內建消息隊列

#define TASK_Q_NUM 4 //任務內建消息隊列的長度void tmr1_callback(void *p_tmr,void *p_arg)
{//......sprintf((char*)pbuf,"ALIENTEK %d",msg_num);OSTaskQPost((OS_TCB* )&Msgdis_TaskTCB, //向任務msgdis_task發送消息(void* )pbuf,      //指向要發送的內容void指針(OS_MSG_SIZE )10,  //指定要發送消息的大小(OS_OPT )OS_OPT_POST_FIFO,//發送消息報錯在隊列末尾(OS_ERR* )&err);//錯誤碼
}void msgdis_task(void *p_arg)
{//......u8 *p;OS_MSG_SIZE size;OS_ERR err; p=OSTaskQPend((OS_TICK )0, //超時時間沒有接收到數據任務就被喚醒(OS_OPT )OS_OPT_PEND_BLOCKING, //一直等待,直到接收到消息(OS_MSG_SIZE* )&size,  //消息的大小(CPU_TS* )0,  //時間戳(OS_ERR* )&err ); //錯誤碼LCD_ShowString(40,270,100,16,16,p);//P為接收到的數據指針
}

事件標志組

事件標志組//
#define KEY0_FLAG 0x01
#define KEY1_FLAG 0x02
#define KEYFLAGS_VALUE 0X00
OS_FLAG_GRP EventFlags; //定義一個事件標志組void start_task(void *p_arg)
{//......OSFlagCreate((OS_FLAG_GRP* )&EventFlags, //指向事件標志組(CPU_CHAR* )"Event Flags", //名字(OS_FLAGS )KEYFLAGS_VALUE, //事件標志組初始值(OS_ERR* )&err); //錯誤碼
}//向事件標志組 EventFlags 發送標志
void main_task(void *p_arg)
{//......//按下按鍵1發送flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,//指向事件標志組(OS_FLAGS )KEY0_FLAG,//決定哪些位清零和置位(OS_OPT )OS_OPT_POST_FLAG_SET,//對位進行置位操作,也可清零(OS_ERR* )&err);//返回錯誤碼//按下按鍵2發送
//向事件標志組 EventFlags 發送標志flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS )KEY1_FLAG,(OS_OPT )OS_OPT_POST_FLAG_SET,(OS_ERR* )&err);				 
}
void flagsprocess_task(void *p_arg)
{//......OS_ERR err; //等待事件標志組OSFlagPend((OS_FLAG_GRP* )&EventFlags, //指向事件標準組(OS_FLAGS )KEY0_FLAG+KEY1_FLAG,//等待 bit0和bit1時,值就為 0X03。(OS_TICK )0,//等待超時時間,為0則一直等待下去(OS_OPT )OS_OPT_PEND_FLAG_SET_ALL+\//多種配置模式:當前配置為等待所有位OS_OPT_PEND_FLAG_CONSUME,//保留事件標志的狀態(CPU_TS* )0,//時間戳(OS_ERR* )&err);//返回錯誤碼printf("事件標志組 EventFlags 的值:%d\r\n",EventFlags.Flags);
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38787.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件模型分類及特點

在軟件開發的世界里,我們經常會遇到業務模型、系統模型和軟件模型這三個層次。這些模型各有特點,相互之間也有著緊密的聯系。通過理解這三個層次之間的映射關系,我們能更好地理解和掌握軟件開發的全過程 1. 業務模型 業務模型描述了組織的業…

政務單位網站SSL證書選擇策略

在數字化快速發展的今天,政務單位網站作為政府與公眾溝通的重要橋梁,其安全性和可信度顯得尤為重要。SSL證書作為保障網站安全的重要手段,其選擇對于政務單位網站來說至關重要。本文將探討政務單位網站在選擇SSL證書時應該考慮的因素&#xf…

如何使用python網絡爬蟲批量獲取公共資源數據教程?

原文鏈接:如何使用python網絡爬蟲批量獲取公共資源數據教程?https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx4&snef281f66727afabfaae2066c6e92f792&chksmfa826657cdf5ef41571115328a09b9d34367d8b11415d5a5781dc4c…

【AI提升】如何使用大模型:本機離線和FastAPI服務調用

大模型本身提供的功能,類似于windows中的一個exe小工具,我們可以本機離線調用然后完成具體的功能,但是別的機器需要訪問這個exe是不可行的。常見的做法就是用web容器封裝起來,提供一個http接口,然后接口在后端調用這個…

KV260視覺AI套件--PYNQ-DPU-Resnet50

目錄 1. 簡介 2. 代碼解析 3. 全部代碼展示 4. 總結 1. 簡介 本文以 Resnet50 為例,展示使用 PYNQ 調用 DPU 運行 Resnet50 網絡的詳細過程,并對其中關鍵代碼做出解釋。 PYNQ是一個針對Xilinx Zynq平臺的Python開發框架,它允許開發者使…

KEYSIGHT是德科技 E5063A ENA 系列網絡分析儀

E5063A ENA 矢量網絡分析儀 18GHz 2端口 降低無源射頻元器件的測試成本 Keysight E5063A ENA 是一款經濟適用的臺式矢量網絡分析儀,可用于測試簡單的無源元器件,例如頻率最高達到 18 GHz 的天線、濾波器、電纜或連接器。 作為業界聞名的 ENA 系列…

深入解析 Laravel 事件系統:架構、實現與應用

Laravel 的事件系統是框架中一個強大且靈活的功能,它允許開發者在應用程序中定義和使用自定義事件和監聽器。這個系統基于觀察者模式,使得代碼解耦和可維護性大大提高。在本文中,我們將深入探討 Laravel 事件系統的工作原理、如何實現自定義事…

python @裝飾器的用法

裝飾器(decorators)是 Python 中的一種高級特性,它允許開發者修改函數或方法的行為,而不改變其定義。裝飾器通常用于日志記錄、權限檢查、性能測量等場景。裝飾器是通過在函數定義的前一行加上 decorator_name 來使用的。 基本用…

Qt簡單文本查找

Qt版本&#xff1a; Qt6 具體代碼&#xff1a; 1. 頭文件 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class QLineEdit; class QDialog; class QPushButton; class QVBoxLayout; class QTextEdit;QT_BEGIN_NAMESPACE namespace Ui…

為什么AI算法工程師要求C++?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c&#xff0b;&#xff0b;的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;能跑出…

找到字符串中所有子串出現的位置python

直接find干就完了。 如果你希望找到字符串中所有子串出現的位置&#xff0c;而不僅僅是一個位置&#xff0c;你可以通過循環查找并收集所有起始位置。以下是修改后的代碼&#xff1a; def find_all_substring_positions(string, substring): positions [] # 用于存儲所有…

與枚舉結合的策略模式

枚舉類&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…

VTK- 可視化過程 四種坐標系統

可視化工具包 VTK(Visualization Toolkit),是一種開源的可視化軟件系統,主要實現計算機圖形學、圖像分析、渲染、圖像處理等功能。VTK 包含一個 C類庫和多個不同語言調用接口層&#xff0c;主要針對2D、3D 圖像和可視化用圖設計。 VTK設計作為一個工具包&#xff0c;不依賴于特…

學校衛星電子怎么自動校準時間呢

在學校的教室里&#xff0c;衛星電子鐘精準地為師生們提供著時間服務&#xff0c;而其自動校準時間的功能令人稱奇。那么&#xff0c;學校衛星電子鐘是如何實現自動校準時間的呢&#xff1f; 學校衛星電子鐘自動校準時間的原理基于衛星導航系統。常見的如北斗衛星導航系統或 GP…

知迪科技驚艷亮相高工智能汽車開發者大會,精彩演講直擊行業痛點、探索未來趨勢

6月27-28日&#xff0c;高工智能汽車開發者大會在上海隆重舉行&#xff0c;知迪科技受邀攜產品與解決方案出席此次大會。 智能汽車已經進入跨域融合新時代。為了進一步降低成本和增強協同&#xff0c;汽車電子架構的設計開始向跨域融合方向演進&#xff0c;并且變革的速度在加快…

java 面試題 - 索引

上腦圖&#xff0c;大家要記住&#xff01;&#xff01; 看不清&#xff0c;上大圖&#xff01; 這幾總結就夠用&#xff01;&#xff01;

nginx優化和防盜鏈

1、隱藏版本號 [roottest1 conf]# vim nginx.conf ? server_tokens off; ? 2、防盜鏈 修改用戶和所在組 [roottest1 conf]# vim nginx.conf ? #user nginx nginx; #表示主進程master會有root創建&#xff0c;子進程會有nginx用戶來創建。 3、設置頁面的緩存時間 主要是…

ExoPlayer架構詳解與源碼分析(14)——ProgressiveMediaPeriod

系列文章目錄 ExoPlayer架構詳解與源碼分析&#xff08;1&#xff09;——前言 ExoPlayer架構詳解與源碼分析&#xff08;2&#xff09;——Player ExoPlayer架構詳解與源碼分析&#xff08;3&#xff09;——Timeline ExoPlayer架構詳解與源碼分析&#xff08;4&#xff09;—…

高考完的假期想學c語言 要注意那些問題?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「c語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;其實建議高考完之后好好玩一…

線上問題定位分析寶典——Linux中定位JVM問題常用命令

查詢Java進程ID #ps axu | grep java #ps elf | grep java查看機器負載及CPU信息 #top -p 1(進程ID) #top (查看所有進程)獲取CPU飆升線程堆棧 1. top -c 找到CPU飆升進程ID&#xff1b; 2. top -Hbp 9702(替換成進程ID) 找到CPU飆升線程ID&#xff1b; 3. $ printf &quo…