You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 C代码编译Proc_Start第3参数指针符号不匹配警告问题

STM32 C代码signedness指针编译警告解决方案

问题现象

编译STM32目标平台的C代码时抛出如下警告,搜索通用同类问题解决方案无效:

warning: pointer targets in passing argument 3 of 'Proc_Start' differ in signedness

相关代码片段

警告触发位置代码

void AppGestRelay_Init(u8 u8lvoie)
{
//Init Dac value for alim
u16 u16lDacValue = (((41435.4-Param.vcoil[u8lvoie])/16376.2)/2.48)*1024;
DrDac_SetValueChip(u8lvoie+1, u16lDacValue);
//Init discharge mode
mProcStartParam(AppGestRelay_DischargeMode, &u8lvoie);
//test
TrackAlt[TRACK1] = ALTER_POS;
TrackRunning[u8lvoie] = TRACK_NOT;
}

原始宏定义

#define     mProcStart(fonct)               Proc_Start(fonct, NULL, (const s8*)#fonct)
#define     mProcStartParam(fonct,param)    Proc_Start(fonct, (TProcParam)(param), #fonct)

被调用业务函数代码

P_PROC(AppGestRelay_DischargeMode)
{
static u8 u8lvoie;
P_BEGIN;
u8lvoie = *(u8*)P_PARAM;
if(TRUE == Param.zener[u8lvoie])
{
    PcfDataW.pin7[u8lvoie] = PIN_OFF;
    printf("on\r");
    P_DELAY(mTICK_MS(10));
    PcfDataW.pin7[u8lvoie] = PIN_ON;
    printf("off\r");
}
else
{
    PcfDataW.pin6[u8lvoie] = PIN_OFF;
    printf("on\r");
    P_DELAY(mTICK_MS(10));
    PcfDataW.pin6[u8lvoie] = PIN_ON;
    printf("off\r");
}
P_EXIT();
P_CLEANUP;
P_END;
}

解决方案

踩坑记录

  • 尝试手动给mProcStartParam传第三个参数,直接触发宏参数数量不匹配的编译错误,该宏本身仅设计为接收2个入参
  • 调整AppGestRelay_Init的业务逻辑可正常运行程序,但编译警告始终存在

最终修复方案

参考同系列mProcStart宏的类型转换逻辑,给mProcStartParam宏的第三个参数增加const s8*强制类型转换即可完全消除警告,修改后的宏定义如下:

#define     mProcStartParam(fonct,param)    Proc_Start(fonct, (TProcParam)(param), (const s8*) #fonct)

警告根因说明

C标准中字符串字面量的默认类型为const char *,而Proc_Start函数的第三个形参要求入参类型为const s8 *;嵌入式场景中s8通常被定义为signed char,ARM GCC等STM32常用编译工具链默认配置下char为无符号类型,两者指针的符号属性不匹配就会抛出该signedness类警告。原始的mProcStart宏已经做了适配转换,属于mProcStartParam宏封装时的参数处理疏漏。


内容的提问来源于stack exchange,提问作者Snorny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:36:07