一、單片機程序框架
1、輪流執(zhí)行
int main (void){
while(1)
{
sing();
dance();
play();
}
}
函數sing執(zhí)行的時間比較長的話,函數dance就不能很快的被執(zhí)行。任何一個函數死掉的話就會影響整個系統(tǒng)。
2、前后臺
在使用 51、AVR、STM32 單片機裸機的時候一般都是在main函數里面用while(1)做一個大循環(huán)來完成所有的處理,即應用程序是一個無限的循環(huán),循環(huán)中調用相應的函數完成所需的處理。
{
flag = 1;
}
int main (void)
{
while(1)
{
if (flag = 1)
{
do_something();
flag = 0;
}
}
}
有什么問題?
3、多任務
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();
}
多任務系統(tǒng)會把一個大問題“分而治之”,把大任務劃分成很多個小問題,逐步的把小任務解決掉,大任務也就隨之解決了,這些任務是并發(fā)處理的。
二、執(zhí)行的程序怎么寫?
以按鍵為例,點亮一個小燈!
1.常規(guī)寫法
int mian(void){
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)
{
printf("按鍵按下\r\n");
}
}
}
2.面向對象的寫法
首先我們把每一個按鍵都看成一個對象,既然是對象就肯定有屬性和行為,比如我們定義一個學生,那么這個學生有什么屬性呢?
{
uint8_t *name; //姓名(變量)
uint8_t age; //年齡(變量)
uint8_t height;//身高(變量)
uint8_t weight;//體重(變量)
} student_t;
但是一個學生還有很多行為對吧,它會唱歌、跳舞、打籃球、也會關注果果小師弟的公眾號對吧,于是我們就可以這樣定義:
{
uint8_t *name; //姓名(變量)
uint8_t age; //年齡(變量)
uint8_t height; //身高(變量)
uint8_t weight; //體重(變量)
void (*Sing_song)(void); //會唱歌(函數指針)
void (*Dance_latin)(void); //會跳舞(函數指針)
void (*Wechat_zhiguoxin)(void); //會關注果果的公眾號(函數指針)
} student_t;
好了,這里我們提到了函數指針,所以就來說一說函數指針。
int * p; < = > void (*zhiguoxin)(void);
p=





