找回密码
 立即注册
查看: 283|回复: 3

代码膨胀后,延时函数不起作用了 | xdata超了

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-24 17:27:15 | 显示全部楼层 |阅读模式

芯片:STC8C2K64S2

image.png

在我尚未添加 QRcode.c跟随项目编译的时候,编译输出如下

Rebuild target 'Target 1'
assembling STARTUP.A51...
compiling Timer.c...
compiling UART.c...
compiling lcd_init.c...
compiling zk.c...
compiling lcd.c...
compiling protocol.c...
compiling model_bt.c...
compiling main.c...
source\main.c(44): warning C322: unknown identifier
source\main.c(196): warning C294: unreachable code
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_DISPLAY_GB2312_STRING?ZK
Program Size: data=15.2 xdata=881 code=14130
creating hex file from ".\Objects\2025_02_10"...
".\Objects\2025_02_10" - 0 Error(s), 3 Warning(s).
Build Time Elapsed:  00:00:01

在我添加了 QRcode.c以后,编译输出如下

Rebuild target 'Target 1'
assembling STARTUP.A51...
compiling Timer.c...
compiling UART.c...
compiling lcd_init.c...
compiling zk.c...
compiling lcd.c...
compiling QR_Encode.c...
compiling protocol.c...
compiling model_bt.c...
compiling main.c...
source\main.c(44): warning C322: unknown identifier
source\main.c(196): warning C294: unreachable code
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_DISPLAY_GB2312_STRING?ZK
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_ENCODEDATA?QR_ENCODE
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_ISCHINESEDATA?QR_ENCODE
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_CHINESETOBINALY?QR_ENCODE
Program Size: data=95.2 xdata=2284 code=30135
creating hex file from ".\Objects\2025_02_10"...
".\Objects\2025_02_10" - 0 Error(s), 6 Warning(s).
Build Time Elapsed:  00:00:01

然后我的延时函数就失效了?

我的延时是依靠定时器计算的。代码如下

void Timer3_Isr(void) interrupt 19
{
    cnt++;
    return;
}

/**
 * @brief 定时器3初始化
 * @param us
 */
int Timer3Init(unsigned long us)
{
    unsigned long timerCnt = 0UL;
    float timerCnt_f = 0.0;
    unsigned int tm3ps = 1;
    timerCnt_f = TIMER_MAX_COUNT - (FOSC * us / CONSTANT / 1.0);
    timerCnt = timerCnt_f;
    if ( timerCnt > MAX_UINT )
    {
        SET_BIT(P_SW2, 7); // 需要先开启扩展功能
        if ( !FIND_BIT(P_SW2, 7) )
            return TIMER3_INIT_FAIL;
        TM3PS = 0U; // 初始化预分频
        // 增加预分频系数直到重载值不超过0xFFFF
        do
        {
            tm3ps = tm3ps + 1;
            timerCnt_f = TIMER_MAX_COUNT - (FOSC * us / CONSTANT / tm3ps);
            timerCnt = timerCnt_f;
        } while ( timerCnt > MAX_UINT );
        TM3PS = tm3ps - 1;// 增加预分频系数
    }
    CLEAR_BIT(T4T3M, 0);// Timer3, not output
    SET_BIT(T4T3M, 1);// Timer3 set mode 1T
    CLEAR_BIT(T4T3M, 2);// Timer3 set mode count
#if TIMER_CHECK
    t3 = timerCnt;
    t3_f = timerCnt_f;
#endif
    T3L = (unsigned char)(timerCnt & 0xff);//Initial timer value
    T3H = (unsigned char)((timerCnt >> 8) & 0xff);//Initial timer value
    SET_BIT(IE2, 5);// Enable timer3 interrupt
    return TIMER3_INIT_OK;
}
/**
 * @brief 延时
 * @param target 根据初始化来输入
 */
int UserDelay(const unsigned int target)
{
    cnt = 0;
    SET_BIT(T4T3M, 3);// Timer3 run
#if 0
    while ( cnt != target )
        WDT_RESET();// 防止因为延时导致WDT超时
#else
    while ( cnt < target )
    {
        if ( cnt % 300 == 0 )
            WDT_RESET();
    }
#endif
    CLEAR_BIT(T4T3M, 3);// Timer3 stop
    return cnt;
}
#ifdef TIMER_DEFAULT_US
#define DEFAULT_DALEY_INIT() Timer3Init(TIMER_DEFAULT_US)
#define Delay_1ms() UserDelay(1U)
#define Delay_10ms() UserDelay(10U)
#define Delay_30ms() UserDelay(30U)
#define Delay_50ms() UserDelay(50U)
#define Delay_100ms() UserDelay(100U)
#define Delay_1s() UserDelay(1000U)
#endif // TIMER_DEFAULT_US

在我代码膨胀前,定时器都是有效且稳定可用的,但在膨胀后延时给我的感觉是起不了一点效果了。

希望有大神能帮我粗浅分析延时不起效果的原因???

由于手头上没有逻辑分析仪,Debug都是依赖UART来判断的。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-2-24 17:34:13 | 显示全部楼层

内存超了cahan

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2025-2-24 18:17:16 | 显示全部楼层
xdata超了,只有2048,你程序有2284。

Program Size: data=95.2 xdata=2284 code=30135
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-24 18:44:59 | 显示全部楼层

感谢各位大大的回复

还是我太菜了,都没用懂 keil5shuai

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:04 , Processed in 0.169347 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表