分享幾點(diǎn)單片機(jī)面向?qū)ο笏枷氲陌咐?/h1>
一、單片機(jī)程序框架
1、輪流執(zhí)行
int main (void){
while(1)
{
sing();
dance();
play();
}
}
函數(shù)sing執(zhí)行的時(shí)間比較長(zhǎng)的話,函數(shù)dance就不能很快的被執(zhí)行。任何一個(gè)函數(shù)死掉的話就會(huì)影響整個(gè)系統(tǒng)。
2、前后臺(tái)
在使用 51、AVR、STM32 單片機(jī)裸機(jī)的時(shí)候一般都是在main函數(shù)里面用while(1)做一個(gè)大循環(huán)來(lái)完成所有的處理,即應(yīng)用程序是一個(gè)無(wú)限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成所需的處理。有時(shí)候我們也需要中斷中完成一些處理。相對(duì)于多任務(wù)系統(tǒng)而言,這個(gè)就是單任務(wù)系統(tǒng),也稱(chēng)作前后臺(tái)系統(tǒng),中斷服務(wù)函數(shù)作為前臺(tái)程序,大循環(huán)while(1)作為后臺(tái)程序。
{
flag = 1;
}
int main (void)
{
while(1)
{
if (flag = 1)
{
do_something();
flag = 0;
}
}
}
有什么問(wèn)題?
3、多任務(wù)
void first_task(){
while (1)
{
if(has_data())
put_data();
}
}
void second_task()
{
while (1)
{
if(get_data())
do_something();
}
}
int main(void)
{
create_task(first_task);
create_task(second_task);
start_scheduler();
}
多任務(wù)系統(tǒng)會(huì)把一個(gè)大問(wèn)題“分而治之”,把大任務(wù)劃分成很多個(gè)小問(wèn)題,逐步的把小任務(wù)解決掉,大任務(wù)也就隨之解決了,這些任務(wù)是并發(fā)處理的。注意,并不是說(shuō)同一時(shí)刻一起執(zhí)行很多個(gè)任務(wù),而是由于每個(gè)任務(wù)執(zhí)行的時(shí)間很短,導(dǎo)致看起來(lái)像是同一時(shí)刻執(zhí)行了很多個(gè)任務(wù)一樣。
二、執(zhí)行的程序怎么寫(xiě)?
以按鍵為例,點(diǎn)亮一個(gè)小燈!
1.常規(guī)寫(xiě)法
int mian(void){
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
{
printf("按鍵按下\r\n");
}
}
}
2.面向?qū)ο蟮膶?xiě)法
首先我們把每一個(gè)按鍵都看成一個(gè)對(duì)象,既然是對(duì)象就肯定有屬性和行為,比如我們定義一個(gè)學(xué)生,那么這個(gè)學(xué)生有什么屬性呢?
{
uint8_t *name; //姓名(變量)
uint8_t age; //年齡(變量)
uint8_t height;//身高(變量)
uint8_t weight;//體重(變量)
} student_t;
但是一個(gè)學(xué)生還有很多行為對(duì)吧,它會(huì)唱歌、跳舞、打籃球、也會(huì)關(guān)注果果小師弟的公眾號(hào)對(duì)吧,于是我們就可以這樣定義:
{
uint8_t *name; //姓名(變量)
uint8_t age; //年齡(變量)
uint8_t height; //身高(變量)
uint8_t weight; //體重(變量)
void (*Sing_song)(void); //會(huì)唱歌(函數(shù)指針)
void (*Dance_latin)(void); //會(huì)跳舞(函數(shù)指針)
void (*Wechat_zhiguoxin)(void); //會(huì)關(guān)注果果的公眾號(hào)(函數(shù)指針)
} student_t;
好了,這里我們提到了函數(shù)指針,所以就來(lái)說(shuō)一說(shuō)函數(shù)指針。
int * p; < = > void (*zhiguoxin)(void);
p=