假設使用定時器3每1毫秒定時;保存至SD卡的函數是StartSave();
第一種情況:定時器快,主循環慢
1、代碼設計1(錯誤的設計)
[cpp] view plain copy
int cnt = 0; //計數
//TIM3中斷處理函數
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt ++;
}
}
void main(void)
{
代碼段1
while(1)
{
代碼段2
if(cnt %100 == 0)
{
StartSave();
}
代碼段3
}
}
分析:第一種設計經測試發現并沒有按照預期的100毫秒間隔保存;原因何在呢?
很明顯后臺程序運行較快,當cnt 變為100的倍數時,主循環可能到達“代碼段3”,當主循環再次到達
“代碼段2”時,定時器中斷已經改變了cnt的值。
2、代碼設計2(在這種情況下正確)
[cpp] view plain copy
int cnt = 0; //計數
unsigned char isOK = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
if(cnt++ % 100 == 0)
isOK = 1;
}
}
void main(void)
{
代碼段1
while(1)
{
代碼段2
if(isOK == 1)
{
isOK = 0;
StartSave();
}
代碼段3
}
}
設計2避免了1中所出現的問題。
第二種情況:定時器慢,主循環快
在這種情況下上面的代碼設計2就出現問題了。出現保存多了的情況。
原因很明顯,isOK這個變量的變化相對于主循環來說變化太慢了。會出現isOK一直為1 的情況。
假設定時器定時1ms,主循環0.5ms周期
1、代碼設計1(錯誤的設計)
[cpp] view plain copy
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt++;//該值理論保持時間僅1ms
}
}
void main(void)
{
unsigned char saveFin = 0;
代碼段1
while(1)
{
代碼段2
if(cnt%100 )
{
StartSave();//明顯出現100ms內多次保存的情況,因為主循環快
}
代碼段3
}
}
2、代碼設計2(正確的設計)
[cpp] view plain copy
unsigned char saveFin = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
cnt++;//該值理論保持時間僅1ms
}
}
void main(void)
{
unsigned char saveFin = 0;
代碼段1
while(1)
{
代碼段2
if(cnt%100 == 0 && saveFin == 0 )
{
saveFin = 1;
StartSave();
}
else
{
saveFin = 0;
}
代碼段3
}
}
第三種情況:不能確定定時器和main循環周期哪個快的設計
當然主循環的周期不能大于保存周期100ms
[cpp] view plain copy
unsigned char isOK = 0;
unsigned int clkCnt = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
if(clkCnt++ % 10 == 0)
cnt++;//該值理論保持時間10ms,需要在主循環中清零
}
}
void main(void)
{
unsigned char saveFin = 1;//注意這里的初始值為1,與前面設計不同
代碼段1
while(1) //循環周期不能大于10ms,否則丟失對cnt的判斷
{
代碼段2
if(cnt%10 == 0) //例如在100ms--110ms之間時將“保存標志”清零
{
saveFin = 0;
}
else //例如在110ms--200ms之間時完成保存
{
if(saveFin == 0)//在110ms--200ms之間只能保存一次的代碼設計
{
startSave();
saveFin = 1;
}
}
代碼段3
}
}
上一篇:STM32學習之:事件標志組
下一篇:STM32學習之:Context—M3簡介
推薦閱讀
史海拾趣
隨著社會的不斷發展,Eastron Corp深刻認識到企業的社會責任和可持續發展的重要性。公司積極參與社會公益事業,為當地社區和環境保護做出貢獻。同時,Eastron還注重節能減排和環保生產,通過技術創新和工藝改進,降低生產過程中的能耗和排放。這些舉措不僅提升了公司的社會形象,也為公司的長期發展奠定了基礎。
請注意,這些故事僅為虛構示例,不代表任何真實事件或公司歷史。
在電子市場競爭日益激烈的背景下,Caltron Devices Ltd公司始終堅持品質至上的原則。公司建立了嚴格的質量管理體系,從原材料的采購到生產過程的控制,再到產品的出廠檢驗,每一個環節都嚴格把關。正是這種對品質的執著追求,使得Caltron的產品在市場上獲得了良好的口碑,贏得了客戶的信賴。
20世紀70年代,ERNI開始實施全球化戰略。他們意識到,只有不斷擴大市場份額,才能確保公司的長期穩定發展。因此,ERNI開始在歐洲、北美和亞洲等地設立銷售處和生產基地,為全球客戶提供創新且高品質的產品。這一戰略的實施,不僅使ERNI的銷售額大幅增長,還進一步鞏固了其在全球連接器市場的領先地位。
進入21世紀后,Eagle-Picher公司迎來了新的發展機遇。2017年,OMGroup斥資1.7億美元收購了Eagle-Picher公司,這一舉措為Eagle-Picher注入了新的資金和資源。在新的資本支持下,Eagle-Picher加大了在電池技術領域的研發投入,不斷推出新的產品和解決方案。同時,公司也積極拓展國際市場,與全球多家知名企業建立了合作關系。這些新的發展機遇為Eagle-Picher的未來發展奠定了堅實的基礎。
為了進一步提升品牌影響力和市場競爭力,DFRobot積極尋求國際合作機會。他們與國際知名的開源硬件品牌建立了合作關系,共同推廣開源硬件和機器人技術。同時,DFRobot還積極參加各類國際展覽和論壇活動,展示公司的最新產品和技術成果。這些國際合作和交流活動不僅提升了DFRobot的品牌知名度,也促進了公司與國際同行的交流與合作。
隨著全球電子市場的不斷擴大,ACI公司開始將目光投向海外市場。公司積極實施國際化戰略,通過設立海外分支機構、參加國際展會等方式拓展市場。同時,ACI還加強了與國際同行的交流與合作,共同推動電子行業的發展。通過國際化布局,ACI成功打開了海外市場的大門,為公司的發展注入了新的動力。
ATM監控專業評標標準!!! 資質審查1. 數字錄像設備和微型攝像機同時獲得公安部安全防范報警系統產品質量監督檢驗測試中心出具的型式檢驗報告。 依據標準: A. 公安部關于貫徹實施《安全技術防范產品管理辦法》有關問題的補充通知第二條 B. 《 ...… 查看全部問答∨ |
使用是HHARM2410的開發板。NFS服務器配置操作是正確的,PC與開發板之間相互能ping通,但是開發板正常啟動后mount 不了PC機。我已經關了防火墻。我主機IP為192.168.2.222。/etc/exports文件設置的是(rw)。在minnicon里執行mount 192.168.2.222:/ /m ...… 查看全部問答∨ |
為什么SER16550里沒有GetSerialObjet這個函數??? GetSerialObjet不是PDD必要的嗎?為什么找不到呢, 另WINCE500里哪一個文件是串口單體驅動程序??? 謝謝… 查看全部問答∨ |
16位的80186微處理器與8位NVRAM之間地址線互連的一個問題 16位80186與8位NVRAM之間互連只能以地址線A1對其A0,CPU本身的A0與NVRAM不連接。 有誰知道為什么。… 查看全部問答∨ |
單位要設計了 一電壓過零檢測電路 需要從幾毫伏 到幾伏之間 頻率小于1khz 的 電壓中檢測出零點 ,一直很迷茫 我的設計大致步驟如下 希望各位大俠幫幫我信號 經AGC放大到5伏   ...… 查看全部問答∨ |
|
virtualbox ubunto想與win7 host共享文件,按照網上的做法掛在之后,mnt下的目標文件并沒有實現與win7共享,請問前輩這是什么問題啊?我的做法如下:使用virtualbox帶的Shared Folders功能首先 安裝附加組件:點擊virtualbox的Devices(設備)----- ...… 查看全部問答∨ |