面向?qū)ο笠部梢愿銌纹瑱C(jī)!
一、單片機(jī)程序框架
1、輪流執(zhí)行
int main (void){
while(1)
{
sing();
dance();
play();
}
}
函數(shù)sing執(zhí)行的時(shí)間比較長的話,函數(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)來完成所有的處理,即應(yīng)用程序是一個(gè)無限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成所需的處理。
{
flag = 1;
}
int main (void)
{
while(1)
{
if (flag = 1)
{
do_something();
flag = 0;
}
}
}
有什么問題?
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ù)劃分成很多個(gè)小問題,逐步的把小任務(wù)解決掉,大任務(wù)也就隨之解決了,這些任務(wù)是并發(fā)處理的。
二、執(zhí)行的程序怎么寫?
以按鍵為例,點(diǎn)亮一個(gè)小燈!
1.常規(guī)寫法
int mian(void){
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
{
printf("按鍵按下\r\n");
}
}
}
2.面向?qū)ο蟮膶懛?/span>
首先我們把每一個(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ù)指針,所以就來說一說函數(shù)指針。
int * p; < = > void (*zhiguoxin)(void);
p=