delay_5.c

本文介绍了一个使用C语言实现的简单延时程序。通过获取当前时间并不断检查时间差是否达到预设值来实现延时功能。该程序适用于学习基本的时间处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <stdio.h>
#include <time.h>

void main(void)
 {
    time_t current_time;
    time_t start_time;

    printf("About to delay 5 seconds/n");

    time(&start_time);  // Get starting time in seconds

    do
    {
      time(&current_time);
    }
    while ((current_time - start_time) < 5);

    printf("Done/n");
 }

 

 

<think>我们遇到了一个编译错误:在stm32f10x_it.c文件中,标识符"sysTickCnt"未定义。这是因为在stm32f10x_it.c文件中,我们试图访问在Delay.c中定义的变量sysTickCnt,但没有在该文件中声明它。解决方法:1.Delay.h文件中声明sysTickCnt为外部变量,这样其他文件(特别是stm32f10x_it.c)就可以访问它。2.在stm32f10x_it.c中包含Delay.h头文件。具体步骤:修改Delay.h文件,添加外部变量声明:externvolatileuint32_tsysTickCnt;修改stm32f10x_it.c文件,包含Delay.h头文件。注意:由于sysTickCnt在Delay.c中定义为静态全局变量(static),我们需要移除static修饰符,以便在外部访问。因为static修饰符使得变量只在当前文件内可见。因此,我们需要:-在Delay.c中,将sysTickCnt的static修饰符移除,并在Delay.h中用extern声明。-在stm32f10x_it.c中包含Delay.h。修改后的Delay.h和Delay.c以及stm32f10x_it.c如下:1.Delay.h:```c#ifndef__DELAY_H#define__DELAY_H#include"stm32f10x.h"voidDelay_init(void);voidDelay_ms(uint32_tms);uint32_tDelay_GetTick(void);uint32_tDelay_GetDiffMS(uint32_tprev_tick);externvolatileuint32_tsysTickCnt;//添加外部声明#endif```2.Delay.c:```c#include"Delay.h"//移除static修饰符,以便在外部访问volatileuint32_tsysTickCnt=0;//系统滴答计数器//SysTick中断处理函数(在stm32f10x_it.c中调用)//注意:这个函数现在在stm32f10x_it.c中定义,所以这里不需要重复定义//延时初始化voidDelay_init(void){//配置SysTick为1ms中断if(SysTick_Config(SystemCoreClock/1000)){//错误处理while(1);}}//毫秒级延时voidDelay_ms(uint32_tms){uint32_tstart=sysTickCnt;while((sysTickCnt-start)<ms);}//获取当前系统滴答值uint32_tDelay_GetTick(void){returnsysTickCnt;}//计算时间差(毫秒)uint32_tDelay_GetDiffMS(uint32_tprev_tick){returnsysTickCnt-prev_tick;}```3.stm32f10x_it.c:在文件开头包含Delay.h```c#include"stm32f10x_it.h"#include"Delay.h"//包含这个头文件以访问sysTickCnt//...其他代码...voidSysTick_Handler(void){sysTickCnt++;//现在这个变量是可见的}```这样修改后,编译应该能通过。注意:在多个文件中使用全局变量时,要确保在头文件中使用extern声明,在一个源文件中定义(不加static),在其他需要使用的源文件中包含该头文件。现在,重新编译项目,错误应该消失。如果还有其他错误,请根据具体错误信息再进行调整。</think>编译错误显示在`stm32f10x_it.c`文件中`sysTickCnt`标识符未定义。这是因为该变量仅在`Delay.c`文件中定义,但需要在中断处理文件中访问。以下是完整的修正方案: ### 解决方案 #### 1. 修改`Delay.h`头文件 ```c #ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" // 声明全局可访问的滴答计数器 extern volatile uint32_t sysTickCnt; void Delay_init(void); void Delay_ms(uint32_t ms); uint32_t Delay_GetTick(void); uint32_t Delay_GetDiffMS(uint32_t prev_tick); #endif ``` #### 2. 修改`Delay.c`文件 ```c #include "Delay.h" // 定义全局滴答计数器(移除static限定符) volatile uint32_t sysTickCnt = 0; // 延时初始化 void Delay_init(void) { // 配置SysTick为1ms中断 if(SysTick_Config(SystemCoreClock / 1000)) { // 错误处理 while(1); } } // 毫秒级延时 void Delay_ms(uint32_t ms) { uint32_t start = sysTickCnt; while((sysTickCnt - start) < ms); } // 获取当前系统滴答值 uint32_t Delay_GetTick(void) { return sysTickCnt; } // 计算时间差(毫秒) uint32_t Delay_GetDiffMS(uint32_t prev_tick) { return sysTickCnt - prev_tick; } ``` #### 3. 修改`stm32f10x_it.c`文件 ```c #include "stm32f10x_it.h" #include "Delay.h" // 包含延时模块头文件以访问sysTickCnt // ... 其他中断处理函数 ... // SysTick中断处理函数 void SysTick_Handler(void) { sysTickCnt++; // 增加滴答计数 } ``` #### 4. 修改`stm32f10x_conf.h`文件 确保启用了SysTick中断: ```c #define __Vendor_SysTickConfig 0 // 使用标准库的SysTick配置 ``` ### 错误原因分析 1. **变量作用域问题**: ```c // 错误定义(仅在Delay.c内可见) static volatile uint32_t sysTickCnt = 0; // 正确定义(全局可见) volatile uint32_t sysTickCnt = 0; ``` - `static`关键字将变量作用域限制在当前文件内 - 中断处理文件无法访问该变量 2. **缺少外部声明**: ```c // 在Delay.h中添加外部声明 extern volatile uint32_t sysTickCnt; ``` - `extern`关键字告知编译器变量在其他文件中定义 - 允许其他文件正确引用该变量 3. **头文件包含缺失**: ```c // 在中断处理文件中包含Delay.h #include "Delay.h" ``` - 中断处理文件需要知道`sysTickCnt`的存在和类型 ### 嵌入式系统中的全局变量管理最佳实践 1. **使用extern声明**: ```c // 在头文件中声明 extern volatile uint32_t g_systemTick; // 在源文件中定义 volatile uint32_t g_systemTick = 0; ``` 2. **添加命名前缀**: ```c // 使用g_前缀表示全局变量 volatile uint32_t g_sysTickCnt = 0; ``` - 提高代码可读性 - 避免命名冲突 3. **临界区保护**: ```c // 在中断和主程序共享的变量访问处 __disable_irq(); // 关中断 g_sharedVar = newValue; __enable_irq(); // 开中断 ``` - 防止竞态条件 - 确保数据一致性 4. **volatile关键字**: ```c volatile uint32_t counter; ``` - 告诉编译器不要优化此变量 - 确保每次访问都从内存读取 ### 完整验证流程 1. 更新所有修改后的文件 2. 清理项目并重新编译 3. 验证功能: ```c // 测试代码 uint32_t start = Delay_GetTick(); Delay_ms(100); uint32_t elapsed = Delay_GetDiffMS(start); // elapsed应≈100 ``` 4. 使用调试器验证: - 在SysTick_Handler设置断点 - 观察sysTickCnt是否每秒增加1000次 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值