C 嵌入式应用程序中 time() 函数的问题

2024-04-20

我在用time()在 ARM 微控制器上。处理器一到达此函数就会重新启动。

奇怪的是,当我处于调试模式时,代码运行得很好,但一旦我想将其应用到独立模式,我就会遇到重置。

我是否忽略了什么? 这个功能有替代品吗?

代码部分是这样的

#include <sys/time.h>
#include <stdio.h>

void main (void)
{

   static time_t  rawtime = 0;

   rawtime = time (NULL);
}

这个功能有替代品吗?

可用的时间来源是硬件依赖的,图书馆是硬件独立的。因此,您必须自己提供具有硬件依赖性的库函数的实现,或者在某些情况下它们可能包含在供应商提供的板支持包 (BSP) 中。头文件 time.h 提供了您的实现必须符合的标准声明,而本例中的库提供了一个功能不完整的默认实现。

如果您使用armcc(例如在Keil ARM MDK中使用),则默认time() http://infocenter.arm.com/help/topic/com.arm.doc.dui0475m/chr1359122861930.html实施用途半托管 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/vaq1478249454515.html。也就是说,它从开发主机而不是目标硬件获取时间。

仅当连接到调试主机进行调试时,半主机才起作用。然而在那种情况下time()应该返回 -1 而不是处理器重新启动。此功能不是重新启动的原因 - 您可以通过删除它来证明,重新启动仍然会发生。重新启动只是您明确地从main()- 运行时还应该做什么?它要么直接重新启动,要么可能进入繁忙循环,其中看门狗定时器到期可能会重新启动它。这取决于您的 C 运行时环境实现。此外,根据调试器是否连接,行为可能会有所不同;可以确定片上调试何时处于活动状态,并有条件地执行断点指令,例如中断调试器。

To have time()要与您的目标硬件正常工作而不是使用半托管,您必须重新实现它。它被定义为弱链接,您提供的任何实现都将覆盖默认值,因此在项目中的某个位置您必须有一个函数:

#include <time.h>

time_t time( time_t* timep )
{
    int hour = 0 ;
    int minute = 0 ;
    int second = 0 ;
    int day_of_month = 0 ;
    int month = 0 ; 
    int year = 0 ;

    // Your code here to fill time/date from clock source
    ...

    // Normalise to time.h library epoch time_t (normally Unix epoch)
    struct tm timeinfo;
    timeinfo.tm_mon  = month - 1 ;   // check assumption here Jan = 0 in tm
    timeinfo.tm_mday = day_of_month ;
    timeinfo.tm_year = year + 100 ;  // check assumption here years start from 1900 in tm 
    timeinfo.tm_hour = hour ;
    timeinfo.tm_min  = minute;
    timeinfo.tm_sec  = second;

    // Convert to timestamp
    time_t t = mktime(&timeinfo);
    if( timep != NULL )
    {
        *timep = t ; 
    }

    return t; 
}

如果您的时间源需要进行任何类型的初始化才能工作,您可以通过多种方式执行此操作,例如:

  • 将初始化代码放在之前运行的运行时启动代码中main()。例如,您的启动代码可能有一个名为SysInit()或类似的地方你应该这样做。
  • 要求开发者在使用前进行必要的初始化time()用来。
  • 首次使用时通过修改time()功能如下:

#include <time.h>
#include <stdbool.h>

time_t time( time_t* timep )
{
    static bool initialised = false ;
    if( !initialised )
    {
        initialised = true ;

        // your clock source initialisation here
        ...
    }

    ...

最后一种方法可能是最简单且最不易出错的方法,并且不会为系统添加应用程序不使用时可能不需要的代码time().

您的示例代码包含 stdio.h 但不使用它,但请注意,默认的 stdio 实现同样依赖于半托管,并且可能需要重新定位 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0475m/chr1359122861930.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 嵌入式应用程序中 time() 函数的问题 的相关文章

随机推荐

  • 在什么类型的情况下汇编速度不够快,因此您需要直接的硬件/布尔逻辑解决方案?

    我已经开始通读装配艺术 https nostarch com assembly2 htm 其中有一个关于布尔逻辑的部分 其中指出 当然 使用 Pascal C 甚至汇编语言等语言指定编程问题的解决方案比使用布尔方程指定解决方案要容易得多 因
  • 具有动态嵌套组件的角度循环依赖性

    我在互联网上寻找解决方案 但无济于事 不同情况等 所以请原谅下面的代码转储 我遇到的问题与循环依赖有关 代码转储是为了提供上下文 旁注 我对 Angular 和 Typescript 相当陌生 这个概念 当然 我正在尝试构建一组嵌套组件 它
  • 克隆/拉取 git 存储库时出现致命读取错误

    我在我的系统上使用 Git for Windows git 版本 1 7 4 msysgit 0 并且大多数时候它都工作得很好 但是今天在大学 每当我尝试使用 Git 时 我都会遇到问题git clone or git pull or ge
  • 在新日期上调用 getTime 时,未定义不是函数

    当尝试运行它时 我得到 未定义不是一个函数 我缺少什么 function bench func var start new Date getTime for var i 0 i lt 10000 i func console log fun
  • 当多个Spring Singleton实例同时访问时

    如果您在 Spring 配置中的单例范围内定义服务 那么如果多个用户尝试同时访问它 即作为依赖项注入到您的控制器中 会发生什么情况 它应该引起任何冲突吗 或者 IoC 容器将保留后面的调用直到第一个调用完成 如果是这样 它会降低大型应用程序
  • 绑定到枚举的关联值

    是否有一个标准的方法来绑定 比如说 TextField到枚举的关联值 所以 鉴于此 enum Choice case one String case two String 我可以以某种方式将它用作视图中的绑定吗 State var choi
  • 当方向设置为水平时,UIPageViewController 响应垂直平移

    我在这上面花了几个小时 我已经初始化了UIPageViewController with UIPageViewControllerNavigationOrientationHorizontal 但由于某种原因viewControllerBe
  • 我可以在共享库中声明全局变量吗?

    我可以在库中声明一个全局变量 然后将其编译为共享对象吗 通过将其声明为 extern 从其他库或主应用程序代码中引用它是否安全 理论上它是有效的 niko dev1 snippets cat libcode c int variable l
  • drools 中是否有任何 API 可以通过传递值来动态创建 drl 文件?

    我知道如何使用所有方法在 KIE 工作台中创建 DRL 文件 但我的问题是不使用 KIE 工作台 我们可以创建 drl使用我们所需的值进行文件 如果有任何可能性 请建议我 同样的方式建议我任何与此相关的 API 提前致谢 您可以使用Droo
  • 移动 safari 图片上传及其大小

    众所周知 Safari 移动版现在允许通过相机或图像库上传文件 问题 是 当从相机中拍摄照片时 它会按原样发送 这意味着它占用的内存非常大 我认为即使在 iPhone 4 上也大约有 2 或 3 mb 这使得上传速度非常慢并且消耗带宽 不适
  • 为什么 Visual Studio 有时无法到达我的断点?

    我一直在使用 Visual Studio 2005 和 2008 我注意到有时当我在代码中放置断点时 它不想转到断点 所以我重新启动我的电脑 然后它又可以工作了 好像有什么东西卡住了 这种事只发生在我身上吗 我怎样才能防止这种情况发生 这让
  • 使用 GORM 根据子表中的列进行排序?

    我有一个名为员工和子表地址的表 现在我想使用 GORM 获取地址表中按地址1排序的员工列表 Employee findAllByName name max maxRecords offset 100 sort Address address
  • 如何在JTree中的节点旁边显示特定的属性名称和值?

    我想在节点名称旁边显示属性的名称和值JTree 谁能告诉我该怎么做 这是我用来显示的代码JTree import javax swing import java awt import java awt event import java a
  • 如何获取 iPhone MPMoviePlayer 视频的总时间?

    我只想弄清楚如何获取视频的总时间 以秒为单位 是否有加载的视频元数据之类的 MP电影播放器 控制器有财产duration iOS 3 2 电影的时长 以秒为单位 只读 property 非原子 只读 NSTimeInterval持续时间 如
  • 就 RESTful 和无状态而言,拥有 /currentUser 等 REST 资源是否合法?

    就 RESTful 和无状态而言 拥有这样的资源是相当合法的 用户 123 但是 问题是 拥有省略用户 ID 并假设它是从用户会话在服务器上隐式解析的资源是否合法 例如 loggedUser 当标识符为 123 的用户被授权时 该资源将指向
  • 获取 Ruby 中第一个 = 符号之后的子字符串

    纯粹出于好奇 是否有一种更优雅的方法来简单地获取第一个之后的子字符串 字符串中的符号 以下作品回馈name bob string option name bob string string index 1 1 只是感觉不太像Ruby 这也有
  • 用于 Java 的 JWT(JSON Web Token)库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个使用 Java 和 AngularJS 开发的 Web 应用程序 并选择实现令牌身份验证
  • Fabric 上的事件中心已关闭 编写您的第一个应用程序

    我目前正在尝试在此处运行 Hyperledger Fabric 的第一个应用程序示例 gt http hyperledger fabric readthedocs io en release 1 1 write first app html
  • 您推荐哪种工作流引擎? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑在这个即将到来的项目中使用工作流引擎的想法 我们知道使用工作流引擎有很多注意事项 并且我们在许多平台上拥有丰富的开发经验 因此我
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include