구조체에 10 개의 함수 포인터가 있습니다. 구조체의 전역 인스턴스는 로컬 함수를 가리키는 초기화 된 함수 포인터입니다. 내 응용 프로그램에서 하나 이상의 함수 참조를 사용하면 링커가 맵 파일에 10 개의 모든 함수를 포함시킵니다.IAR 컴파일러 : 구조체를 함수 포인터와 함께 사용하면 맵 파일에 함수에 관계없이 구조체에 선언 된 모든 함수가 표시됩니다.
메모리를 절약하기 위해 애플리케이션에 사용 된 기능을 링커에 포함시켜야합니다. 구조체에서 참조되는 모든 함수가 아닙니다. (제조업체) 파일 r_adc_api.h에
구조체
typedef struct st_adc_api
{
ssp_err_t (* open)(adc_ctrl_t * const p_ctrl, adc_cfg_t const * const p_cfg);
ssp_err_t (* scanCfg)(adc_ctrl_t * const p_ctrl, adc_channel_cfg_t const * const p_channel_cfg);
ssp_err_t (* scanStart)(adc_ctrl_t * const p_ctrl);
ssp_err_t (* scanStop)(adc_ctrl_t * const p_ctrl);
ssp_err_t (* scanStatusGet)(adc_ctrl_t * const p_ctrl);
ssp_err_t (* read)(adc_ctrl_t * const p_ctrl, adc_register_t const reg_id, adc_data_size_t * const p_data);
ssp_err_t (* sampleStateCountSet)(adc_ctrl_t * const p_ctrl, adc_sample_state_t * p_sample);
ssp_err_t (* close)(adc_ctrl_t * const p_ctrl);
ssp_err_t (* infoGet) (adc_ctrl_t * const p_ctrl, adc_info_t * const p_adc_info);
ssp_err_t (* versionGet)(ssp_version_t * const p_version);
} adc_api_t;
은 ** 헤더 r_adc.h은 **
extern const adc_api_t g_adc_on_adc;
(제조업체) 배열 및 함수 정의 파일에 r_adc.c (제조업체에서)
const adc_api_t g_adc_on_adc =
{
.open = R_ADC_Open,
.scanCfg = R_ADC_ScanConfigure,
.infoGet = R_ADC_InfoGet,
.scanStart = R_ADC_ScanStart,
.scanStop = R_ADC_ScanStop,
.scanStatusGet = R_ADC_CheckScanDone,
.sampleStateCountSet = R_ADC_SetSampleStateCount,
.read = R_ADC_Read,
.close = R_ADC_Close,
.versionGet = R_ADC_VersionGet
};
및 ## 함수 정의 ##
** MAP 파일 ** 내 응용 프로그램에서 MAP file
, 내가 adc_on_g_adc.open (...)를 사용하는 경우; 링커가 당기는 대신 모든 10 개의 심볼을 맵 파일로 가져옵니다. R_ADC_Open();
하나의 함수가 호출 되더라도 .map 파일이 구조체의 모든 함수를 가져 오는 원인은 무엇입니까?
편집 :이 모든 것을 하나의 파일로 묶어서 필요한 맵 파일을 제공합니다. IAR 컴파일러는 사용하지 않는 함수를 생략합니다. 헤더와 소스를 여러 개 사용할 때만 작동하지 않습니다.
우선, ***. h ** 파일의 각 정적 할당은 다른 경우에 사용한 횟수만큼 복사됩니다. 둘째, 달성하고자하는 것이 명확하지 않습니까? 콜백 구조의 동적 크기? 런타임에 함수를 등록하는 함수 목록이있는 경우에는 준 변환 할 수 있습니다. 이것이 플러그인이 일반적으로 등록되는 방법입니다. – 0andriy
0andriy, 답장을 보내 주셔서 감사합니다. 이것은 제조업체에서 제공 한 것으로 일부 변경 사항과 함께 사용해야합니다. 이 일을하기위한 그들의 생각은 함수 호출에서 일어나는 일들에 대해 많은 걱정없이 인터페이스 (함수 포인터)를 사용하는 것입니다. 나는 코드 섹션 최적화 때문에 그것의 내부에서 놀고있다. –
질문이 명확하지 않습니다. 단어의 양을 줄이고 간단한 예를 들면 다음과 같습니다. a) 존재하는 것과 b) 달성하고자하는 것. – 0andriy