A. 請教單片機多線程的方法
要實現多線程,就需要操作系統了。對於51單片機運行操作系統有點困難。
現在STM32單片機用的越來越多了,因硬體資源多,速度快,更適合運行操作系統。
所以,首先要學習STM32,再學習操作系統,才能實現你的要求。
B. 什麼是數據競爭多線程編程如何防止數據競爭單片機編程如何防止數據競爭
創建互斥對象。
簡單的說,每個線程相當於一個人,數據相當於廣播。你要創建的是一個麥克風。
只有這個人拿到麥克風,才能發廣播。
還有什麼不懂的,自行網路「互斥對象」
C. 51單片機如何實現多線程多任務有哪些程序可以在「後台」自己運行
51單片機可以實現執行時間片形式的多線程任務,具體做法是:1、弄個表兩位元組一個單位存一下各個任務的執行地址。2、在中斷級別較高的T0定時器中斷中,把中斷壓進堆棧的那兩個位元組保存到表裡。3、用表裡別的線程的地址重壓進堆棧。4、從中斷里退出就可以切到另一個線程繼續跑了。
我記得這個在早先2000年那時候的大學計算機系單片機原理專業課里講過,但是那科掛掉的實在太多,現在好像已經把這些獨門絕技大多給砍沒了,就剩背背匯編指令集。
D. 51單片機如何實現多線程多任務換距話說,有哪些程序可以在「後台」自己運行
2、51內部沒有捕捉器、AD轉換和硬體PWM;
3、中斷系統在執行中斷函數時是需要佔用cpu資源的,就是當前程序暫停跑過去執行中斷函數,結束了再回去繼續;
4、如果是用來設置功能或模式的寄存器,工作完成後其值是不會改變的,會改變的比如uart的數據緩存器以及定時器的時值,這些隨時改變的寄存器也不會影響正常工作;
舉例中的錯誤,51單片機定時器能夠定時ds最大周期是65535微秒,即65.535毫秒,不存在定時一秒的情況,除非定時中斷內用變數累加判斷。
E. 單片機有線程嗎
大部分單片機可以移植嵌入式實時操作系統的,操作系統內核會分配CPU給各個任務工作,也就是平時說的多線程,或者多任務
F. 單片機中如何實現多線程,多任務
如果不用OS, 可以將不同任務放在定時器中斷里, 然後將任務分步驟執行(這大概就叫狀態機吧). 比如任務1放在主循環里, 任務2放在定時器1中斷里, 任務3放在定時器2中斷里. 或者自己利用定時器實現時間片輪換演算法. 關鍵是分配好任務執行的時間片, 以滿足對不同事件的響應. 感覺單片機實時性的要求很高.
G. 單片機 同時處理多件事
單片機是不能同時處理多件事情。如果要想同步處理多件事情,只能是先中斷正在做的事情,轉移到其它需要做的事情上,等事情處理完畢,或者還是處理到一定程度,再轉回之前正在做的事情。
一、關於單片機:
單片機(Microcontrollers)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
二、單片機的應用分類:
單片機(Microcontrollers)作為計算機發展的一個重要分支領域,根據發展情況,從不同角度,單片機大致可以分為通用型/專用型、匯流排型/非匯流排型及工控型/家電型。
1、通用型
這是按單片機(Microcontrollers)適用范圍來區分的。例如,80C51式通用型單片機,它不是為某種專門用途設計的;專用型單片機是針對一類產品甚至某一個產品設計生產的,例如為了滿足電子體溫計的要求,在片內集成ADC介面等功能的溫度測量控制電路。
2、匯流排型
這是按單片機(Microcontrollers)是否提供並行匯流排來區分的。匯流排型單片機普遍設置有並行地址匯流排、 數據匯流排、控制匯流排,這些引腳用以擴展並行外圍器件都可通過串列口與單片機連接,另外,許多單片機已把所需要的外圍器件及外設介面集成一片內,因此在許多情況下可以不要並行擴展匯流排,大大減省封裝成本和晶元體積,這類單片機稱為非匯流排型單片機。
3、控制型
這是按照單片機(Microcontrollers)大致應用的領域進行區分的。一般而言,工控型定址范圍大,運算能力強;用於家電的單片機多為專用型,通常是小封裝、低價格,外圍器件和外設介面集成度高。 顯然,上述分類並不是惟一的和嚴格的。例如,80C51類單片機既是通用型又是匯流排型,還可以作工控用。
H. 51單片機如何實現多線程多任務換距話說,有哪些程序可以在「後台」自己運行 比如定時器,計數
另一種說發是單片機中斷里的函數成為前台,而主函數成為後台,這是前後台系統,但多個任務同時運行不能做到,只能是說在單位時間內任務是多任務並行的
I. 我想用單片機(89c51)來實現兩個函數程序的同時運行,不知如何實現請教廣大朋友,謝謝
你這個應該是兩個功能同時實現,漸亮漸暗是用延時實現的PWM,而燈的閃爍其實就是單片機的輸出為矩形波,兩個功能同時實現時,就是在矩形波的波峰波谷時期加入了PWM。兩個波形的疊加(將兩個功能柔和在一起)。在燈漸亮漸暗子程序中,一個for循環for(i=1;i<2000;i=i+100)其實就是一個PWM的周期,是相同的、一定的,那麼就可以利用判斷是第幾個周期來決定該周期是否要閃爍,還是關閉(也就是利用了PWM的周期來確定矩形波的周期)。
這個循環for(j=0;j<1;j++)是不是可以去掉呢。。。。。。。。
修改後的程序:調試過了(燈的埠改為P0了)
#include<reg51.h>
sbit green=P0^0;
sbit blue=P0^1;
sbit red=P0^2;
sbit shan=P0^3;
sbit shan2=P0^4;
void delay(int i)
{
while(--i)
{
;
}
}
void bianse1(void)//這個函數程序是控制燈漸亮漸暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan=~shan; /*經過200個PWM周期燈的亮滅交替,改變這個參數可以改變燈的閃爍頻率*/
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//紅,綠,藍一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan=~shan;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//紅藍綠下降
}
}
void bianse2(void)//這個函數程序是控制燈漸亮漸暗
{
int i;
for(i=1;i<2000;i=i+100)
{
if(i%200==0)shan2=~shan2;
green=0;
blue=0;
red=0;
delay(i);
green=1;
blue=1;
red=1;
delay(2000-i);//紅,綠,藍一起上升
}
for(i=2000;i>0;i=i-100)
{
if(i%200==0)shan2=~shan2;
blue=1;
green=1;
red=1;
delay(2001-i);
red=0;
green=0;
blue=0;
delay(i);//紅藍綠下降
}
}
void shanshuo(void)//這個函數程序是控制燈閃爍
{
int i,k;
for(k=0;k<10;k++)
{
shan=0;
delay(5000);
shan=1;
delay(4000);
}
for(i=0;i<10;i++)
{
shan2=0;
delay(5000);
shan2=1;
delay(4000);
}
}
void main(void)
{
shan=1;
shan2=1;
while(1)
{
bianse1();
bianse2(); /*****兩個燈的交替閃爍*****/
green=1;
blue=1;
red=1;
//shanshuo();
}
}
J. 怎麼樣讓51單片機實現偽多線程工作(軟體上實現)簡單的論述一下,有程序實例更好.
你也知道,51單片機沒辦法實現多線程操作,所以你已經指明了條件,實現偽多線程工作(軟體上實現),也就是軟體模擬多線程。
我想你也沒指望這個多線程多優秀,只是實驗性質,鍛煉鍛煉編程技巧。這個還是可以實現的,雖然我也沒走過。
沒查資料,不知道有沒有這方面的介紹和可移植的操作系統,僅憑自己想像與你探討。
其實早期的WINDOWS操作系統,由於CPU 是單核,本質上就是偽多線程,包括現在的ARM 單片機可以實現的UCOSII。
51單片機實現偽多線程要解決兩個問題,一個是速度,一個是內存規模。實現方法不過是利用定時中斷把CPU的工作分割成時間片,分配給不同的任務。這有點像數碼管的動態掃描,只要速度夠快,感覺上各個任務的運行就是流暢的。問題的關鍵在於現場保護和緊急任務的處理,這兩項調度好,編制一個偽多線程程序並不難。
但由於51資源有限,真的只能是試驗一下。