萬逸涵

@56han

Joined on Dec 29, 2023

  • 1. 簡介 本實驗透過 FreeRTOS 建立 LEDTask_App 與 ButtonTask_App,並使用任務間通訊(Inter-Task Communication, ITC)機制來實現 LED 狀態的切換。透過本實驗,學習 FreeRTOS 任務建立、佇列傳遞(queue communication)、排程機制以及按鍵 debounce handling。 :::info 任務(task)是在 FreeRTOS 中執行的基本單位,每個 task 都是由一個 C 函數所組成,意思是你需要先定義一個 C 的函數,然後再用 xTaskCreate() 這個 API 來建立一個 task。 這個 C 函數有幾個特點,它的返回值必須是 void,其中通常會有一個無限迴圈,所有關於這個 task 的工作都會在迴圈中進行,而且這個函數不會有 return。 FreeRTOS 不允許 task 自行結束(使用 return 或執行到函數的最後一行)。 Task 被建立出來後,它會配置有自己的堆疊空間和 stack variable(就是 function 中定義的變數)。 void ATaskFunction(void *pvParameters){
     Like 1 Bookmark
  • 考題 1. 位元操作 給一個整數變數 a,寫出兩段程式碼。第一個要設定 a 的 bit 4,第二個要清除 a 的 bit 4。在以上兩個操作中,要保持其它位不變。 #define SET_BIT(a, n) ((a) |= (1 << (n))) #define CLEAR_BIT(a, n) ((a) &= ~(1 << (n))) :::info 來源:韌體工程師的0x10個問題 :::
     Like  Bookmark
  • contributed by <56han> 第 7 週測驗題 - 測驗 1 將 2 個 32 位元寬度的整數合併 Question: 為甚麼 x 和 y 都要加 0L,再進行位移? Answer: 因為 x 和 y 的位元寬是 32 位元 ( uint32_t ) ,左移 32 位會超出它的位元寬,會出現 warning: left shift count >= width of type。long 是 64 位元,左移 32 位在這種情況下是合法的,不會引發警告。 (-1L >> 32) 計算出的值是0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111。 static inline uint64_t bit_compound(uint32_t x, uint32_t y)
     Like  Bookmark
  • contributed by < 56han > 自我檢查清單 研讀 Linux 效能分析 必要的設定和準備工作 kernel.perf_event_paranoid 是用來決定你在沒有 root 權限下 (Normal User) 使用 perf 時,你可以取得哪些 event data。預設值是 1 ,你可以輸入 $ cat /proc/sys/kernel/perf_event_paranoid 來查看權限值。一共有四種權限值: :::info
     Like  Bookmark
  • contributed by < 56han > 閱讀〈因為自動飲料機而延畢的那一年〉的啟發 在每一次開始寫作業時,都覺得遇到了許多挫折,明明已經學過程式起碼四年,卻常常需要花許多時間理解題目或程式碼,觀摩其他學員的成果時,都會思考「為甚麼他想的到?」 飲料機的程式愷宏是寫不出來的,之所以能在一個月內完成,是因為我在大學期間就寫過好幾個網站了。愷宏能和工廠溝通、設計出可用的零件,是因為他在大一就在跑工廠做東西了。紘銘能輕易的設計出飲料機的電路,是因為他曾花了很多時間在電子電路課上頭,做了很多習題,纏著教授把每個疑惑都搞懂才罷休。 經過閱讀此文章後,發現所有成果都是一點一滴的累積而來,發明自動飲料機的每一個細節都不簡單,他們能成功也不是偶然,或許當下不是學習本科的內容,但或許有一天就會派上用場。現在 linux 課程也讓我有一樣的體悟,雖然常說學 linux 不知道哪天會用到,但這些努力可以讓我學習到解決問題的能力、勇於面對挫折的精神、開發系統軟體的態度、對細節的重視,以及理論和實務的融會貫通。此外,文章也讓我思考能力不足的原因,「為甚麼他想的到?」是因為其他學員花很多時間去搞懂 C 語言規格,因此現在才能在時間內完成作業,而我從以前就是為了應付作業、交差了事的學生,現在才感受到痛苦與挫折,是因為我回來還債了,就如同開頭提到的 人不付出犧牲,就得不到任何回報。如果要得到什麼,就必須付出同等的代價,這就是鍊金術的基本原則,等價交換。當時我們深信著,這就是這世界的真理。------《鋼之鍊金術師》
     Like  Bookmark
  • contributed by < 56han > 第 1 週測驗題 2024q1 第 1 週測驗題 測驗 1 1. 補完程式碼,使其得以符合預期運作 取得 list 尾端的 node_t,先確認是否 left 且 left->next 不為 NULL,若不為 NULL 則指標往下一個 node_t 指,即 left->next,最後跳出 while 迴圈時剛好會指到 tail。 node_t *list_tail(node_t **left)
     Like  Bookmark
  • contributed by < 56han > 第 3 週測驗題 2024q1 第 3 週測驗題 測驗 1 $Y_m = \begin{cases} c_m + d_m, & \text{if } a_m = 2^m \ 0, & \text{if } a_m = 0 \end{cases}$
     Like  Bookmark
  • contributed by < 56han > Reviewed by allenliao666 commit 內文中句首應該要大寫,例如 commit f88e90a q_ascend 的內文及註解有誤,應該是若右側節點小於當前節點才需標記當前節點為需要刪除。 q_ascend 和 q_descend 有不需雙層迴圈即可完成的實作方法,可以嘗試看看。 開發紀錄寫得很清楚,閱讀起來很舒服。 :::danger
     Like  Bookmark