• C语言 符号的不同意义

    C语言的许多符号在不同的上下文环境里有不同的意义,相当于被“重载”了。如下展示了一些符号的不同意义。

    static

    • 在函数内部,表示该变量的值在各个调用间一直保持延续性。类似与全局变量,区别在于作用域不同。
    • 在函数外部,表示该函数或者变量只对本文件可见。

    extern

    • 用于函数定义,表示全局可见(属于冗余,因为函数名在默认情况下具有外部的链接属性,如果函数没有在调用它的转换单元中定义,编译器就会把这个调用标记为外部,让链接程序处理它)
  • IAR 和 keil 使用外部 SDRAM 的区别

    当芯片内部的 SRAM 不够用时,就需要在外部扩展 SDRAM,然后在写程序时将一些比较大的 buffer 定义在外部内存中。在进行正确的配置之后,对外部 SDRAM 的使用,和芯片内部的 SRAM 是一样的,可以直接对 SDRAM 的地址进行读写访问。

    因此,最简单的方法就是,如下所示的代码,直接使用指针指到外部 SDRAM 的地址,之后对指针进行移动,便可以对全部 SDRAM 进行读写。使用这种方法需要特别小心,要确保指针指向的地址在 SDRAM 的地址空间。

    1
    2
    3
    4
    5
    uint8_t *sdram_buf = (uint8_t*)SDRAM_ADDR;
    uint8_t *sdram_ptr = sdram_buf;
    uint32_t sdram_useSize = 0;
    uint8_t sdram_full = 0;

  • C语言 ringBuffer 实现

    一、 ringBuffer 介绍

    ringBuffer 称作环形缓冲,也有叫 circleBuffer 的。就是取内存中一块连续的区域用作环形缓冲区的数据存储区。这块连续的存储会被反复使用,向 ringBuffer 写入数据总是从写指针的位置开始,如写到实际存储区的末尾还没有写完,则将剩余的数据从存储区的头开始写;从该 ringBuffer 读出数据也是从读指针的位置开始,如读到实际存储区的末尾还没有读完,则从存储区的头开始读剩下的数据。

    为了保证写入的数据不会覆盖 ringBuffer 里还没有被读出的数据,以及读出的数据不是已经读出过的旧数据,需要使用一个变量 btoRead 表示该 ringBuffer 中有效的数据。使用变量 length 表示该环形缓冲区中真实的缓冲大小。使用指针 source 指向实际的缓存地址。

    使用 ringBuffer 读写数据,要确保读写数据的速率和实际缓冲区大小的匹配。如果不匹配,可能会导致溢出,比如读数据太慢,而写数据很快,实际的缓存区又太小,导致整个缓冲区都是还没有被读出的数据,此时新的数据就无法写入。正确使用 ringBuffer 可以保证数据的连续,降低读模块和写模块之间的耦合性。更多关于生产者-消费者模型的知识可以看这篇博客

  • C语言 malloc 内存泄漏

    错误代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    int Init_layer2_Decoder(void)
    {
    Stream = (struct mad_stream*)malloc(sizeof(struct mad_stream));
    Frame = (struct mad_frame*)malloc(sizeof(struct mad_frame));
    Synth = (struct mad_synth*)malloc(sizeof(struct mad_synth));

    if(Stream==NULL || Frame==NULL || Synth==NULL)
    {
    printf("init mp2Dec fail!\n");
    return -1;
    }

    mad_stream_init(Stream);
    mad_frame_init(Frame);
    mad_synth_init(Synth);

    return 0;
    }
  • STM32 硬件CRC和软件CRC速度比较

    一、测试条件

    硬件: STM32L432KC
    主频: 80MHz
    编译器: IAR 8.20.1
    编译选项: High Speed no size constraints
    CRC 生成多项式: 0x782f

  • 下载 tumblr 标记为喜欢的内容

    源代码发布在github : get_tumblr_likes

    一、介绍

    本项目使用 python 编写,分析 tumblr 账户中喜欢的内容,给出资源链接,并下载。
    其中 test.json 是一份 tumblr 返回的喜欢数据的 json 示例,提取里面图片和视频的资源地址后下载,下载的内容如下图。

    这里写图片描述

  • STM32 无法打印浮点数

    一、问题

    使用 IAR 开发 STM32,发现无法通过 printf 重定向到串口打印出浮点数。代码如下:
    这里写图片描述

    输出结果如下:
    这里写图片描述

    可见,浮点数部分无法正常显示。

  • STM32L432 CoreMark跑分测试

    测试环境: IAR for ARM 7.80.4

    测试得分:277
    官方给出的分数为:273.55
    如下图:
    这里写图片描述

  • STM32F469 CoreMark跑分测试

    一、CoreMark 介绍

    CoreMark 是一项测试处理器性能的基准测试。代码使用 C 语言写出,包含:列表,数学矩阵操作和状态及 CRC 等运算法则。目前 CoreMark 已迅速成为测量与比较处理器性能的业界基准测试。CoreMark 的得分越高,意味着性能更高。

    二、代码移植

  • 掌控堆栈确保系统稳定 IAR技术手册翻译

    翻译自 IAR 技术手册

    堆和栈在嵌入式系统中是非常基础的概念。正确设置堆和栈的大小对于系统的稳定可靠非常重要。不正确设置时,系统可能会以某种非常奇怪的方式崩溃而造成灾难性的后果。

    堆和栈的大小必须被程序员设置。通常情况下计算栈使用量都是非常困难的,但是在小型嵌入式系统中却比较容易,并且理解栈的使用也可以解决一些很难发现的运行时错误。另一方面,给栈分配过多的空间也意味着对内存资源的浪费。对于大多数嵌入式项目来说,最坏情况下栈的最大使用量是一个非常重要的信息,因为这是一种非常简单的估计应用程序所需栈大小的方法。堆的溢出通常不会导致严重的错误,但是这并不能带来什么安慰,因为很少有应用程序可以在溢出的情况下恢复。

13456715