在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式軟件開發是什么意思

技術讓夢想更偉大 ? 來源:CSDN ? 2023-06-20 09:33 ? 次閱讀

1.問題描述

在使用定時器的過程中最令人苦惱的就是,定義flag,holdtime,每用一次定義就會導致中斷函數中標志位滿天飛,時間變量在程序中隨處可見。在想要移植,又不敢隨便刪除。程序處于高耦合狀態,失去了一個.c 一個 .h的意義。

2.如何解決這種問題

引入注冊機制。為了方便說明注冊機制,舉一個例子:手機在使用相機這個功能時,有一個操作:將拍攝的照片發送出去。以程序來實現這一過程,最容易想到的方法如下:

在相機的發送模塊添加以下代碼:

if(選擇發送)
{
if(選擇微信發送)
{
獲取發送人;
選擇發送人;
}
elseif(選擇qq發送)
{
獲取發送人;
選擇發送人;
}
elseif(選擇微博發送)
{
獲取發送人;
選擇發送人;
}
.
.此處省略一萬行
.
}

這是最容易想到的實現方式,就如上面定時器的實現方式,哪里要用了,再定義一系列變量就是了。回到相機例子,假設某一天一個比微信還火的聊天軟件出現了,用戶安裝了,想要發送圖片,這時該怎么做 ?當然,只能在上面相機的發送發送模塊中添加else if(。。。。)和它的實現方式了,也就意味著,每更新一個需要使用圖片功能的軟件,就必須去修改相機模塊,是不是覺得和我們的定時器很像?

注冊的精髓:解耦各個模塊。程序講究高內聚,低耦合。我目前對這句話的理解是:高內聚:每一個功能模塊(c文件,h文件),內部不和其他模塊相互調用,比如障礙物函數里面不應該有狀態這一個變量存在,更不應該擁有零地標恢復運行這一操作。它只做一件事,處理IO口信息,產生相應的障礙物狀態。低耦合:障礙物函數與其他模塊的耦合,僅僅為產生的障礙物狀態。下面深入探討注冊機制。

何謂注冊:我目前這樣理解的,相機要發送圖片,面臨著多種發送方式,每一種發送方式肯定會調用不同的函數。反過來想,就是我有很多的應用,要使用相機這個模塊(此處對比定時器)。既然這樣,相機模塊定義一個注冊函數,供其他模塊調用,以告訴相機,允許使用對應的發送方式。

#definenum_max20//最大設備數

typedefstruct
{
 u8 num;//當前注冊設備數
u8list_name[num_max];//用于保存注冊設備列表
void(*click[num_max])(u8*temp);//存放不同模塊(微信qq)的發送函數地址
}Equiment;
EquimentCOM;

/**************************注冊函數****************************************/
voidPhoto_Register(void(*a)(u8*temp),u8list)//提供給外部的接口
{
if(COM.num

微信中若要使用,在安裝過程中,提示打開相機權限,便是調用上述注冊函數。將微信本身自集成的發送函數地址傳給相機,相機每次發送只需判斷哪些設備注冊了,選擇對應的方式即可。如此一來,出現再多的新應用要使用相機,只需注冊一次即可。相機與微信QQ微博等模塊之間完美解耦!類似的,定時器的解耦也能這樣處理。

定時器運用注冊機制

首先,要想解耦,必須去掉胡亂定義的標志位與時間變量,只允許一個時間變量。因此定義一個32位的時間變量,不要任何條件限制,讓他一直自加。

參考arduino 中定時處理的方法:定義一個函數獲取當前時間,保存下當前時間,運行一段時間后,再次查詢當前時間,兩次做差,便得出運行的時間。從以上不難看出,關鍵點在于:獲取當前時間的函數,當前時間的存放,做差后的時間。以下是實現方法:

time.h

#include"stm32f10x.h"
#ifndef__TIME_H
#define__TIME_H

#defineTimerID_max20//最大注冊設備數
#defineRunOutOf_time(ID,ms)(systime.now-systime.last[ID-1]

time.c

#include"time.h"

/*********提供給外部的API*******************/
voidTimer_Init(u16CountData,u16FreqData);
unsignedcharsystime_get(void);
voidRefresh(u8ID);
/***********************************************/
SYSTIMEsystime=定義SYSTIME類型變量,并初始化函數指針
{
.get_id=systime_get,
.refresh=Refresh,
.timer_init=Timer_Init
};

/****************************************************/
//函數名:Timer_init
//描述:初始化定時器
//輸入:中斷時間相關
//輸出:null
/****************************************************/
voidTimer_Init(u16CountData,u16FreqData)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

TIM_DeInit(TIM4);
TIM_TimeBaseStructure.TIM_Prescaler=FreqData;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM4,TIM_FLAG_Update);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM4,ENABLE);

}

/****************************************************/
//函數名:systime_get
//描述:獲取當前時間,并產生一個注冊
//輸入:null
//輸出:null
/****************************************************/
unsignedcharsystime_get()
{
if(systime.ID

在.c與.h實現了以上后,面向外部的只有三個函數

/*********提供給外部的API*******************/
voidTimer_Init(u16CountData,u16FreqData);
unsignedcharsystime_get(void);
voidRefresh(u8ID);
/***********************************************/

定時器的使用方法

1./*初始化*/
2.
/**********任務1實現運行等閃爍,頻率1s**********/
voidtask1()
{
staticu8Task1_ID;
if(!Task1_ID)
Task1_ID=systime.get_id();
if(RunOutOf_time(Task1_ID,1000))
RUN_LED()=1;
elseif(RunOutOf_time(Task1_ID,2000))
RUN_LED()=0;
elseif(RunOutOf_time(Task1_ID,3000))
RUN_LED()=1;
elseif(RunOutOf_time(Task1_ID,4000))
RUN_LED()=0;
elseif(RunOutOf_time(Task1_ID,5000)
RUN_LED()=1;
else
systime.refresh(Task1_ID);
}

/*******************任務2實現運行等閃爍,頻率100ms**********************/
voidtask2()
{
staticu8Task1_ID;
if(!Task1_ID)
Task1_ID=systime.get_id();
if(RunOutOf_time(Task1_ID,100))
RUN_LED()=1;
elseif(RunOutOf_time(Task1_ID,200))
RUN_LED()=0;
elseif(RunOutOf_time(Task1_ID,300))
RUN_LED()=1;
elseif(RunOutOf_time(Task1_ID,400))
RUN_LED()=0;
elseif(RunOutOf_time(Task1_ID,500))
RUN_LED()=1;
else
systime.refresh(Task1_ID);
}

/***************main函數實現任務1運行10s,任務2運行10s****************/
intmain(void)
{
staticu8main_ID;
System_Init();
while(1)
{
if(!main_ID)
main_ID=systime.get_id();
if(RunOutOf_time(main_ID,10000))
task1();
elseif(RunOutOf_time(main_ID,20000))
task2();
else
systime.refresh(main_ID);
}
}

以上,任何函數想要使用定時器,只需要按要求,設立一個ID存儲變量,以存儲注冊時分配的ID,便可調用定時器,且在任何平臺上均可方便的移植,只需修改硬件初始化。

此程序無法實現時刻任務執行,例如某任務要100ms執行一次,只能用作時間段內執行。原因在于程序主循環會耗時,導致輪詢時無法精準捕捉到100ms時刻,想要達到此效果,還需改進或者完全換一種思路來寫,例如捕捉放到中斷中,主循環來查詢100ms使能位。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7525

    瀏覽量

    164150
  • 定時器
    +關注

    關注

    23

    文章

    3254

    瀏覽量

    115144
  • 嵌入式軟件
    +關注

    關注

    4

    文章

    240

    瀏覽量

    26687
  • Arduino
    +關注

    關注

    188

    文章

    6477

    瀏覽量

    187541

原文標題:嵌入式軟件開發中的注冊機制

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式軟件開發與非嵌入式軟件開發的區別?

    嵌入式軟件開發與非嵌入式軟件開發區別?設備驅動開發與裸機驅動開發區別?
    發表于 04-02 06:29

    如何學習嵌入式軟件開發

    該不該放棄嵌入式、單片機這條路?如何學習嵌入式軟件開發
    發表于 12-24 06:32

    如何學習嵌入式軟件開發

    1. 如何學習嵌入式軟件開發嵌入式軟件開發一定要結合開發板來學習,所有的知識都可以在開發板上
    發表于 02-11 07:33

    嵌入式軟件開發系列教程 (很多本書)

    嵌入式軟件開發系列教程 (很多本書)
    發表于 03-28 09:45 ?230次下載

    什么是嵌入式軟件開發

    嵌入式軟件開發又是指什么?   隨著嵌入式軟件系統結構越來越復雜,嵌入式軟件
    發表于 04-20 08:43 ?8793次閱讀

    嵌入式軟件開發的優缺點淺談

    嵌入式軟件開發的優缺點淺談 從事嵌入式軟件開發的好處是: 1 目前國內外這方面的人都很稀缺。     
    發表于 11-28 15:40 ?3194次閱讀

    嵌入式軟件開發與Embedded-GIS

    1.嵌入式軟件開發 市場現狀 嵌入式操作系統 嵌入式軟件開發特點 嵌入式
    發表于 02-28 10:39 ?36次下載

    ARM嵌入式軟件開發

    ARM嵌入式軟件開發ARM嵌入式軟件開發ARM嵌入式軟件開發
    發表于 01-15 17:29 ?65次下載

    基于嵌入式軟件開發中構件技術的研究

    基于嵌入式軟件開發中構件技術的研究
    發表于 10-30 15:36 ?6次下載
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>中構件技術的研究

    嵌入式軟件開發的優勢分析

    為什么當今嵌入式行業會如此受歡迎呢?我們從事嵌入式軟件開發有什么好處嗎?小編就來說說我的看法吧,嵌入式軟件開發的優勢我們可以從幾點來看。
    的頭像 發表于 12-21 15:23 ?5265次閱讀

    嵌入式軟件開發做什么?嵌入式開發培訓學哪些

    嵌入式行業可以說從幕后走到前臺,大家對他都很熟悉了,我國嵌入式人才缺口每年在50萬左右,相關調查報告稱嵌入式軟件開發是未來幾年最熱門和最受歡迎的職業之一。但是還有很多人不知道
    發表于 11-03 10:36 ?19次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>做什么?<b class='flag-5'>嵌入式開發</b>培訓學哪些

    嵌入式軟件開發需要懂的硬件基礎

    嵌入式軟件開發需要懂的硬件基礎
    發表于 11-03 11:06 ?25次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>需要懂的硬件基礎

    嵌入式軟件開發入門

    1. 如何學習嵌入式軟件開發嵌入式軟件開發一定要結合開發板來學習,所有的知識都可以在開發
    發表于 12-07 17:21 ?17次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>入門

    嵌入式軟件開發流程

    電子發燒友網站提供《嵌入式軟件開發流程.ppt》資料免費下載
    發表于 11-17 14:37 ?4次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>流程

    嵌入式軟件開發與AI整合

    嵌入式軟件開發與AI整合是當前技術發展的重要趨勢之一。隨著人工智能技術的快速發展,嵌入式系統越來越多地集成了AI算法,以實現更復雜的智能功能。以下是關于嵌入式
    的頭像 發表于 07-31 09:25 ?778次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b>與AI整合
    主站蜘蛛池模板: yy6080亚洲半夜理论一级毛片| 日本三黄色大| 免费又黄又爽1000禁片| 伊人网综合在线视频| 午夜网站在线| 日韩插插| 新版天堂资源中文在线| 成人性色生活影片| 欧美一欧美一区二三区性| 日本成人免费在线视频| 亚洲欧美日韩综合一区| 午夜三级网| 欧美aⅴ| 亚洲国产七七久久桃花| 免费在线观看一级片| 黄色成人在线| 久久久久国产| 91破处视频| 一级毛片日韩a欧美| 西西人体大胆高清啪啪欧洲| 好大好硬好深好爽的视频| 国产精品资源在线观看网站| 欧美午夜免费观看福利片| 天天做天天爱天天爽综合区 | 日本a级特黄三级三级三级 | 丁香六月综合网| 亚洲一区二区在线播放| 亚洲人成影网站~色| 日本久久久| 都市激情综合| 欧美四色| 亚洲日本一区二区| 亚洲一区二区三区免费看| 中国黄色一级毛片| 日本三级理论| 97菊爱网| 午夜精品久久久久久久99| 天天摸夜夜添狠狠添2018| 天天尻| 日本xxxxxxxxx18| 一区二区三区亚洲|