软件杂项知识
Erickson_qq_
这个作者很懒,什么都没留下…
展开
-
使用互斥量保证线程安全
每个线程在打印之前获取这个互斥量,获取到了才能打印,打印结束后再释放互斥量。这样就实现了线程排队打印的效果,一个线程打印结束后才能由下一个线程打印,防止内容混在一起。如果没有缓冲区,直接使用printf格式化然后打印的话,获取互斥量的时间会很长,降低效率。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。想象如果两个线程同时调用printf打印数据,两个线程发出的打印内容就有可能混在一起,造成混乱。原创 2023-11-06 11:05:31 · 57 阅读 · 0 评论 -
条件编译#ifdef和#if defined使用哪个比较好。
if defined避免了#ifdef可能产生的错误警告。一些编译器在#ifdef检查一个未定义的宏时会报警,而#if defined不会。#if defined可以检查一个宏是否被定义为任意值,而#ifdef要求宏必须定义为1。#if defined更符合语义,明确指出这是一个已定义的宏。#ifdef更常用于检查是否有定义某个变量,不太适合用于宏的检查。使用#ifdef时需要确保宏只被定义一次,否则可能导致意外结果。#if defined表达更明确,对其他开发者更友好。对于条件编译,建议使用。原创 2023-11-02 20:57:54 · 90 阅读 · 0 评论 -
增加了一个任务,所有任务就都无法运行了,为什么。
因为芯片的ram大小不够。例如,假设你使用的是STM32G0系列芯片,ram只有8K,其他任务占用太多的ram,而增加了一个任务之后,就溢出了,导致ram不够大,所以导致所有任务都无法运行。原创 2023-10-28 21:32:28 · 26 阅读 · 0 评论 -
printf函数重定向,以实现嵌入式设备的uart打印。
其中usart_data_transmit和usart_flag_get都是GD32芯片的库函数中,和uart相关的部分。为了实现重定向printf函数,我们需要重写fputc()这个C标准库函数,因为printf在C标准库中实质是一个宏,最终是调用了fputc()这个函数。注意,还必须包含#include 头文件,并且在keil的设置中,Target选项卡,勾选Use MicroLIB选项。用户编写了与C库函数相同名字的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。原创 2022-10-02 19:41:20 · 676 阅读 · 0 评论