- 至MY數位學習下載Posix_GCC_Simulator_6.0.4.zip
- cd micro,在~/micro 下解壓縮
- unzip ~/下載/Posix_GCC_Simulator_6.0.4.zip
- 在~/micro 下 cd Posix_GCC_Simulator/FreeRTOS_Posix/Release/
- 在~/micro/Posix_GCC_Simulator/FreeRTOS_Posix/Release/ 執行make
這是我筆電Debian底下的指令
clementyan@Lenovo-B480:~/Document$ cd micro/
clementyan@Lenovo-B480:~/Document/micro$ mv ../../Downloads/Posix_GCC_Simulator_6.0.4.zip ./
clementyan@Lenovo-B480:~/Document/micro$ ls
edsim51di edsim51di.zip Posix_GCC_Simulator_6.0.4.zip
clementyan@Lenovo-B480:~/Document/micro$ unzip Posix_GCC_Simulator_6.0.4.zip
Archive: Posix_GCC_Simulator_6.0.4.zip
creating: Posix_GCC_Simulator/
.
.
inflating: Posix_GCC_Simulator/FreeRTOS_Posix/Debug/FreeRTOS_Kernel/portable/GCC/Posix/subdir.mk
clementyan@Lenovo-B480:~/Document/micro$ cd Posix_GCC_Simulator/FreeRTOS_Posix/
AsyncIO/ Debug/ FreeRTOS_Kernel/ Release/
Common_Demo/ FileIO/ ParTest/
clementyan@Lenovo-B480:~/Document/micro$ cd Posix_GCC_Simulator/FreeRTOS_Posix/Release/
clementyan@Lenovo-B480:~/Document/micro/Posix_GCC_Simulator/FreeRTOS_Posix/Release$ make
clementyan@Lenovo-B480:~/Document/micro/Posix_GCC_Simulator/FreeRTOS_Posix/Release$ ls
AsyncIO FileIO FreeRTOS_Posix main.o objects.mk sources.mk
Common_Demo FreeRTOS_Kernel main.d makefile ParTest subdir.mk
------------------------------------------------------------------------------------------------------------
若不是Debian是用學校電腦Ubuntu可能會有錯誤則其解決步驟為下列
- 先確定/usr/lib/i386-linux-gnu/librt.so是否存在,若不存在需安裝 sudo apt-get install libc6-dev
- 編輯/Posix_GCC_Simulator/FreeRTOS_Posix/Release內之makefile,第39行 gcc -pthread -lrt -o"FreeRTOS_Posix".......改為gcc -L/usr/lib/i386-linux-gnu -o"FreeRTOS_Posix".....-pthread -lrt
- 儲存關閉
- ~$ make clean
- ~$ make
------------------------------------------------------------------------------------------------------------
在~/micro/Posix_GCC_Simulator/FreeRTOS_Posix/Release建立task資料夾
mkdir task
寫main.c
gedit(vim) main.c &
至MY數位學習教教材三 主程式模板(main.c)之內容複製到main.c
建立工作之函式
xTaskCreate(工作函式,工作描述字串,堆疊深度,參數,優先順序,工作指標)
工作函式宣告
void 工作函式名(void * pvParams);
說明:void表示任何型態接可以用
例:
void vTask1(void *pvParams) {
.
.
}
int main() {
xTaskCreate(vTask1,"Task1",100~1000,NULL,1,NULL);//說明:1表示最低優先
vTaskStartScheduler();//開始工作排程
while(1);
return 0;
}
void vTask1(void *pvParams)
{
char *str="Task 1\n";
int dlyCnt;
while(1) {
printf(str);
for(dlyCnt=0;dlyCnt<10000;dlyCnt++);
}
}
int main() {
xTaskCreate(vTask1,"Task1",100,NULL,1,NULL);
xTaskCreate(vTask2,"Task2",100,NULL,1,NULL);
xTaskCreate(vTask2,"Task3",100,NULL,1,NULL);
vTaskStartScheduler();
while(1);
return 0;
}
在task目錄下更換目錄到Release
cd ..
cp task/main.c ../.
make clean
make
執行 ./FreeRTOS_Posix
當把task 3之優先順序改為2時,task1,task2將不被執行,此稱為starvation(飢餓)
要解決飢餓需使工作可以進入阻斷狀態
呼叫vTaskDelay 被喚醒時才開始計數滴答,時間不固定
vTaskDelayUnt:1 固定延遲時間,可作週期
呼叫delay使其可以進入blocked阻斷狀態
vTaskDelay(延遲之滴答數)
當工作呼叫vTaskDelay時工作會進入阻斷狀態,從此滴答數起算到延遲之滴答次數時,工作進入就緒狀態
通常一秒鐘滴答一百次
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~