在IAR Embedded Workbench中,善用代碼模板可大幅提升嵌入式項目開發效率,確保各功能模塊風格統一、結構規範。本文介紹如何編輯模板、生成標準化 .h/.c 文件並掛載到模塊管理框架。
菜單:Edit → Code Templates,打開模板編輯器。語法規則:
#TEMPLATE "模板名稱", "字段1"=默認值, "字段2"=默認值 ...
& 定義快捷鍵(如 &File → Alt+F)。> 建立子菜單層級(如 Corporate>Class)。%1, %2... 對應字段,%c 為光標最終位置,$DATE$ $USER_NAME$ 等為內置變量。定義兩個頂級模板:File>file_h 和 File>file_c,生成符合項目規範的頭文件與源文件骨架。
file_h#TEMPLATE "File>&file_h", "&file name", "&Description"=--, "&Created"="$DATE$, by $USER_NAME$"
/**
******************************************************************************
* File Name : %1.h
* Description : %2
* Created : %3
******************************************************************************
*/
#ifndef __%1_H
#define __%1_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes */
#include "stm32f3xx_hal.h"
#include "datatype.h"
#include "osal.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private defines */
/* Prototypes */
extern const OsalFnx_S g_st%1OsalFn;
#ifdef __cplusplus
}
#endif
#endif /*__ %1_H */
/************************ (C) COPYRIGHT Chongqingfuzik *****END OF FILE****/
關鍵點:防重複包含宏、C++兼容、固定包含項目公共頭文件、導出模塊操作函數結構體指針 g_st%1OsalFn。
file_c#TEMPLATE "File>&file_c", "&file name", "&Created"="$DATE$, by $USER_NAME$"
/**
******************************************************************************
* @file %1.c
* @created: %2
* @brief
******************************************************************************
*/
#include "%1.h"
#include "msg_def.h"
#include "trace.h"
#define _use_%1_module
#ifdef _use_%1_module
/* Private typedef/define/macro/variables/prototypes */
void %1_Init(void);
void %1_Start(void);
void %1_Tick(void); // 10ms 中斷/實時任務
void %1_Process(void); // 10ms 非實時任務
void %1_Process_1s(void);
void %1_Process_1min(void);
BOOL %1_Trace(void);
RESP_E %1_Debug(const uint8* in);
BOOL %1_Message_Deal(Msg_Id_E msg, uint32 para1, uint32 para2, void* pt);
uint16 %1_Trace_Pwr(void);
/* Exported functions */
const OsalFnx_S g_st%1OsalFn = {
%1_Init, %1_Start, %1_Tick, %1_Process,
%1_Process_1s, %1_Process_1min,
%1_Debug, %1_Message_Deal, %1_Trace_Pwr
};
/* 以下為各函數骨架實現,均含 Trace_Stack 埋點 */
void %1_Init(void) { Trace_Stack(%1_Init); }
void %1_Start(void) { Trace_Stack(%1_Start); }
void %1_Tick(void) { Trace_Stack(%1_Tick); }
void %1_Process(void) { Trace_Stack(%1_Process); }
void %1_Process_1s(void) { Trace_Stack(%1_Process_1s); }
void %1_Process_1min(void) { Trace_Stack(%1_Process_1min); }
RESP_E %1_Debug(const uint8* in) { Trace_Stack(%1_Debug); return RESP_NULL; }
BOOL %1_Message_Deal(Msg_Id_E msg, uint32 para1, uint32 para2, void* pt) {
if(!Msg_Id_IsValid(msg)) return FALSE;
Trace_Stack(%1_Message_Deal);
return TRUE;
}
uint16 %1_Trace_Pwr(void) { Trace_Stack(%1_Trace_Pwr); return 0; }
#endif /* %1_MODULE_ENABLED */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
設計亮點:
Trace_Stack 記錄調用棧,便於運行時追蹤。_use_%1_module 配合 %1_MODULE_ENABLED 支持編譯裁剪。在 msg_def.c 中:
#include "new_module.h"const FileModoule_S g_stFileModoule[Modoule_ID_MAX+1] = {
{Modoule_ID_NULL, NULL, NULL},
{Modoule_ID_TRACE, "trace", &g_stTraceOsalFn},
{Modoule_ID_HWDPT, "hwdpt", &g_sthwdptOsalFn},
{Modoule_ID_NEW, "new_module", &g_stNewModuleOsalFn}, // 新增行
{Modoule_ID_MAX, NULL, NULL}
};
其中 FileModoule_S 結構包含:模塊ID、名稱字符串、操作函數結構體指針 OsalFnx_S*。
Statement>if:if(%c){}Statement>for:for(int %2=0; %2<%1; ++%2){%c}(字段:End Value, Variable)Corporate>Task:任務函數骨架 + 消息表註冊Corporate>Function:標準函數頭註釋 + 參數/返回值佔位符通過IAR代碼模板,將「模塊.h/.c骨架、生命週期接口、消息/調試/電源掛載、追蹤埋點」全部標準化,新建模塊僅需幾秒鍵盤操作,極大減少樣板代碼錯誤,統一團隊編碼風格,加速嵌入式項目交付。