C語言筆記-malloc前的強制轉換 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 - 12月 26, 2019 看別人的程式多少都會看到在malloc前面加上強制轉換: dlouble * p=(double*)malloc(sizeof(length*(sizeof(double)); 會這樣加是因為早期的malloc回傳値是char*,所以要做強制轉 現在已經不需要加了,因為malloc回傳的是一個void指標,編譯器會自動轉換 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 留言
FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete) - 11月 07, 2018 函數 功能 xTaskCreate() 動態創建一個任務 xTaskCreateStatic() 靜態創建一個任務 xTaskCreateRestricted() 創建使用 MPU 進行限制任務 vTaskDelay() 任務刪除 1. xTaskCreate () --創建一個任務,RAM默認使用heap_4.c(後面章節補充)管理內存。 新創建的任務默認是就緒狀態,如果當前無更高優先權的任務運行,此任務將立刻執行: pvTaskCode :任務函數(函數名稱) pcName :任務名子,名稱不能超過 configMAX_TASK_NAME_LEN, 會自動刪除超過字串 usStackDepth :任務的棧大小 pvParameters :傳遞給任務的參數 uxPriority :任務的優先權,0~configMAX_PRIORITIES-1 pvCreatedTask : 任務句柄。任務創建成功會返回此任務句柄,其他API也會用到 返回值: errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:失敗,內存不夠 pdPASS:成功 2. vTaskDelete () --刪除任務函數,被刪除的任務將不存在也不再運行。 任務被刪除後,句柄將無法 繼 續使用,若使用 xTaskCreate() 創立則刪除後會釋放掉內存,申請的記憶體會在空閒任務中釋放,所以刪掉任務需要一點時間給空閒任務。 參數: xTaskToDelete :要刪除的任務句柄 返回值:無 ------------------------------------------------------------------------------ 測試: 1.啟動兩個Task void vTaskFunction1 ( void * pvParameters ) { while (1) { taskENTER_CRITICAL(); printf ( "===in task1===\n" ); taskE 閱讀完整內容
FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil() - 11月 09, 2018 FreeRTOS 任務中,在函數中使用延時函數就會讓任務進入阻塞狀態 (block) , 通常使用 vTaskDelay() 及 vTaskDelayUntil() 。 -vTaskDelay() 為相對延時 -vTaskDelayUntil() 為絕對延時 要使用則在 FreeRTOSConfig.h 中必須定義 : #define INCLUDE_vTaskDelay 1 #define INCLUDE_pcTaskGetTaskName 1 -------------------------------------------------------- 1.vTaskDelay() 其原型為 : void vTaskDelay ( const TickType_t xTicksToDelay ) -參數: const TickType_t xTicksToDelay 如果直接給數值,如 vTaskDelay(100) ,則表示暫停 100 個 ticks ,由於每個 MCU 的 Ticks 不同, FreeRTOS 提供了 #define portTICK_RATE_MS portTICK_PERIOD_MS #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) 幫我們轉為 ms ,故 vTaskDelay(100) 就是讓任務暫停 100ms 2.vTaskDelayUntil() 其原型為: void vTaskDelayUntil ( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) 使用範例: // Perform an action every 10 ticks. void vTaskFunction( void * pvParameters ) { TickType_t xLastWakeTime; const TickType_t x 閱讀完整內容
C語言筆記-文本處理(1) 善用 asprintf取代sprintf - 12月 30, 2019 sprintf應該都不陌生,不過sprintf()使用上世有風險的,它的原型是: int sprintf(char *str,const char *format,...) 也就是說使用前必須先建立好空間,再用sprintf()將內容填入: int temp=10; char str[20]; sprintf(str," %d * %d *= %d",temp,temp,temp*temp); str輸出來看的結果為:10 * 10 = 100 但如果今天temp為10000,輸出就是: 10000 * 10000 = 100000000 則長度超過20,造成over flow的問題 用snprintf/asprintf取代不安全的sprintf才是最好的 #include <stdio.h> void get_strings(char const *in){ char *cmd; int len = strlen("strings ") + strlen(in) + 1; cmd=(char*)malloc(len); snprintf(cmd, len, "strings %s", in); printf("cmd:%s\n",cmd); free(cmd); } 用snprintf,需要先確定長度,還需要自己調用malloc 使用asprintf,它會自動調用malloc void get_strings_(char const *in){ char *cmd; asprintf(&cmd, "strings %s", in); printf("cmd:%s\n",cmd); free(cmd); } --------------------- asprintf跟sprintf很像,區別在於傳入的是字串的位址而不是字串本身, asprintf()會自動分配空間 int asprintf(char **str,char *fmt,...) _ 閱讀完整內容
留言
張貼留言