首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

IAR嵌入式開發:自定義代碼模板實現功能模塊標準化生成(.h/.c)

     編輯:關於C語言

IAR嵌入式開發:自定義代碼模板實現功能模塊標準化生成(.h/.c)

在IAR Embedded Workbench中,善用代碼模板可大幅提升嵌入式項目開發效率,確保各功能模塊風格統一、結構規範。本文介紹如何編輯模板、生成標準化 .h/.c 文件並掛載到模塊管理框架。

一、IAR代碼模板編輯入口

菜單:Edit → Code Templates,打開模板編輯器。語法規則:

#TEMPLATE "模板名稱", "字段1"=默認值, "字段2"=默認值 ...
  • 模板名稱可用 & 定義快捷鍵(如 &File → Alt+F)。
  • 用 > 建立子菜單層級(如 Corporate>Class)。
  • 佔位符 %1, %2... 對應字段,%c 為光標最終位置,$DATE$ $USER_NAME$ 等為內置變量。

二、核心功能模塊模板(.h / .c)

定義兩個頂級模板:File>file_h 和 File>file_c,生成符合項目規範的頭文件與源文件骨架。

1. 頭文件模板 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。

2. 源文件模板 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****/

設計亮點:

  • 標準化模塊生命週期接口:Init/Start/Tick/Process/1s/1min。
  • 內置調試命令、消息處理、電源管理掛載點。
  • 統一使用 Trace_Stack 記錄調用棧,便於運行時追蹤。
  • 宏 _use_%1_module 配合 %1_MODULE_ENABLED 支持編譯裁剪。

三、模塊掛載到系統框架

在 msg_def.c 中:

  1. 包含新模塊頭文件:#include "new_module.h"
  2. 在模塊表註冊:
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骨架、生命週期接口、消息/調試/電源掛載、追蹤埋點」全部標準化,新建模塊僅需幾秒鍵盤操作,極大減少樣板代碼錯誤,統一團隊編碼風格,加速嵌入式項目交付。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved