- 博客(34)
- 收藏
- 关注
原创 无符号整型
比如,如果原来的a是-1,转换为unsigned int是4294967295,然后把这个值赋给int变量a,这时候会发生实现定义的行为。在大多数系统中,这个值会被视为-1,因为int是有符号的,且无法表示4294967295,导致符号位被设置,所以结果可能仍然是-1。因此,即使去掉注释,输出可能还是-1,-1,然后第三个是4294967295。第二个printf同样使用%d,此时a的值没有改变,因为注释掉了转换的那行,所以还是-1,所以第二个输出也是-1。因为a被初始化为-1,所以这里应该输出-1。
2025-03-29 11:16:15
349
原创 TTL肖特基触发器
TTL(Transistor - Transistor Logic)即晶体管 - 晶体管逻辑电路,是一种常见的数字集成电路技术。而肖特基触发器则是在 TTL 电路基础上结合了肖特基二极管技术的触发器。触发器是一种具有记忆功能的二进制存储器件,能够存储一位二进制信息,是构成各种时序逻辑电路的基本单元。
2025-03-13 15:52:25
650
原创 定义结构体时的内存对齐现象
double 通常占 8 字节,自身对齐值为 8。char u1[5] 占 5 个字节, int u2[2] ( int 通常 4 字节,2 个 int 共 8 字节),所以 union uu 大小为 8 字节。- m1 占 4 字节, m2 占 1 字节,为了满足内存对齐, m2 后面会填充 3 个字节, m3 占 4 字节, ua (即 union uu )占 8 字节。- int m1 :在常见的 32 位或 64 位系统中, int 类型通常占 4 个字节。
2025-03-05 11:26:23
196
原创 在定时器中断函数中添加延时函数的危害
系统在执行延时函数期间,CPU 等资源会被一直占用在这个相对耗时且可能不必要的等待操作上,而无法去高效地处理其他更有价值的任务,造成了资源的浪费,降低了系统整体的运行效率,尤其在一些资源比较紧张的嵌入式系统等环境中,这种资源浪费可能会对系统的其他功能实现产生连锁的负面影响。循环里不断执行无实际意义的操作来消耗时间)实现的延时函数,千万不要直接放在中断函数内,因为这种方式会严重阻塞中断,导致上述提到的诸如定时精度下降、无法及时响应其他中断等诸多问题,应采用上述更合理、更科学的方法来实现延时需求。
2025-03-04 17:08:08
381
原创 TMS320F28027的下拉输入如何实现
要将 TMS320F28027 的 GPIO 配置为下拉输入模式,基本思路和配置浮空输入类似,但 TMS320F28027 芯片本身没有内置下拉电阻,不过可以通过外部电路添加下拉电阻来实现下拉输入的效果。在软件配置上,主要还是对相关寄存器进行操作来设置引脚为输入模式以及选择 GPIO 功能。
2025-03-04 16:10:49
355
原创 TMS320F28027的GPIO有哪些寄存器
这些寄存器共同协作,实现了 TMS320F28027 GPIO 引脚的灵活配置和控制。在实际应用中,需要根据具体需求对这些寄存器进行相应的读写操作。
2025-03-04 15:42:57
487
原创 C语言中的野指针如何避免
野指针(Dangling Pointer)是指指向无效内存地址的指针,使用野指针会导致程序出现未定义行为,如程序崩溃、数据损坏等。
2025-03-04 11:15:41
293
原创 C语言指针使用注意事项(1)
函数要求传入的参数是变量的地址,用于将读取到的值存储到对应的内存位置。这样代码逻辑清晰,不会出现因。参数求值顺序带来的问题。
2025-03-04 09:52:49
131
原创 volatile关键字在嵌入式中的作用
在 GPIO 结构体中使用volatile关键字是为了确保程序能够正确地与硬件交互,保证每次对 GPIO 寄存器的读写操作都是直接针对硬件寄存器的,避免编译器优化带来的潜在问题,从而提高程序的可靠性和稳定性。
2025-03-02 14:30:47
189
原创 #ifdef __cplusplus extern “C“ #endif的作用
如果头文件中还有类型定义(如结构体、枚举)和全局变量声明,也可采用类似方式:收起c#endif// 类型定义int x;int y;} Point;// 全局变量声明#endif同样,这样能确保在 C 和 C++ 环境中都能正确处理这些声明和定义。将extern "C"和#endif组合放在头文件里声明函数、变量、类型的地方,可保证头文件在不同编译环境下的兼容性,让 C 和 C++ 代码能正确交互。
2025-03-02 14:22:01
593
原创 IQ格式的数据类型有什么特点
C28x 系列 DSP 具有强大的处理能力,但主要采用定点数运算。而实际应用中很多算法是基于浮点数设计的,为了在 C28x DSP 上高效实现这些算法,TI 推出了 IQ 数学库。该库提供了一系列函数,可方便开发者使用定点数进行复杂的数学运算,模拟浮点数的运算效果。
2025-03-01 15:49:37
1935
原创 switch语句的使用注意事项
在 C 和 C++ 语言中, 语句里 后面跟的常量表达式必须是整型(包括字符型,因为字符型本质上是小整数),不能是浮点型或者其他复杂类型。正确的使用方式可以是使用字面常量或者宏定义:收起c
2025-03-01 10:08:49
233
原创 C中的枚举类型
在 C 和 C++ 中,使用enum关键字来定义枚举类型。enum 枚举类型名 {枚举常量1,枚举常量2,// 可以有更多枚举常量MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY。
2025-03-01 09:08:54
368
原创 结构体与共用体的异同及应用(嵌入式)
结构体是一种将不同类型的数据组合在一起的自定义数据类型,它允许用户将多个相关的变量封装在一个单独的实体中。结构体的定义使用structstruct 结构体名 {数据类型 成员1;数据类型 成员2;// 可以有更多成员共用体也是一种自定义数据类型,它允许不同的数据类型共享同一块内存空间。共用体的定义使用unionunion 共用体名 {数据类型 成员1;数据类型 成员2;// 可以有更多成员。
2025-02-28 20:43:24
1711
原创 位域(Bit - field)
例如,在嵌入式系统中,硬件寄存器的不同位可能代表不同的配置信息,使用位域可以方便地对这些位进行读写操作,而不需要进行复杂的位运算。位域是 C 语言中一种特殊的数据结构,允许将一个字节或多个字节的存储空间划分为多个不同宽度的位段,每个位段可以独立地进行读写操作。可以明确指定变量占用 8 位存储空间,并且保证其取值范围是 0 到 255,有助于提高代码的可移植性和可读性。的位域成员,其类型为无符号 8 位整数,并且该成员独占 8 位的存储空间。表示该位域成员占用 8 位的存储空间。表示该类型的宽度为 8 位。
2025-02-28 20:27:08
464
原创 asm(“EALLOW“)
这条内联汇编代码常见于德州仪器(TI)的一些数字信号处理器(DSP),如 TMS320F28x 系列的开发中。TI 的这些 DSP 为了保护一些关键寄存器不被误操作,设计了一种保护机制,需要通过特定的指令来开启对这些寄存器的访问权限,主要作用是开启对受保护寄存器的写访问权限。例如,在 TMS320F28x 系列 DSP 中,一些系统控制寄存器、外设配置寄存器等是受保护的。如果要对这些寄存器进行配置,就需要先执行。指令来恢复寄存器的保护状态,以保证系统的安全性和稳定性。指令,然后再进行写操作。
2025-02-28 17:33:29
577
原创 JTAG接口的特点
JTAG(Joint Test Action Group,联合测试行动小组)接口是一种国际标准测试协议,最初用于芯片内部测试,后来也广泛应用于对电路板上的器件进行测试和对嵌入式系统进行调试、编程等。
2025-02-28 16:38:02
433
原创 如何点亮TMS320F28027德州仪器开发板上的led灯
在 Code Composer Studio 中,将上述代码保存到工程文件中,点击编译按钮进行代码编译。编译成功后,使用仿真器(如 XDS100v3)将程序下载到 TMS320F28027 开发板上,即可看到 LED 开始闪烁。使用 Code Composer Studio(CCS)作为开发环境,它是德州仪器官方提供的集成开发环境,支持 TMS320F28027 芯片的开发。通过以上步骤,你就可以实现对 TMS320F28027 开发板上 LED 亮灭的控制。
2025-02-28 16:23:47
338
原创 如何来理解TMS320F28027的内存映射
内存映射是一种将计算机系统中的不同存储区域(如 RAM、ROM、外设寄存器等)映射到一个连续的地址空间的技术。通过这种映射,CPU 可以像访问内存一样方便地访问各种存储设备和外设,简化了编程和系统设计。在 TMS320F28027 中,内存映射为处理器提供了一个统一的地址视图,使得它能够准确地定位和操作不同类型的存储资源和外设。等结构体就是根据内存映射来定义的,通过访问这些结构体的成员,可以方便地对系统控制寄存器和 GPIO 外设寄存器进行操作。
2025-02-28 16:13:18
444
原创 事件组同步
2.解释:每个任务设置完自身一个位后进入阻塞态,只有但每个任务都设置完后三个任务才会一起开始运行。事件组的等待中是设置任务设置完后就继续执行自己的任务。这行代码定义了所有需要同步的事件位的组合。
2025-02-08 20:52:39
206
原创 事件组等待
函数返回值是事件组在事件位被设置时的值,或者在阻塞时间超时时的值。如果因为等待的位被设置而返回,则返回值是事件组值,在这之前任何位可能已经被自动清除,这取决于。只传递了两个参数,这通常意味着第三个参数使用了默认值,这个默认值会清除事件组中的其他所有位。例如,等待位0和/或位2被设置,可以设置为。,则在函数返回时(不是因为超时),在事件组中设置的任何位将被清除。,这意味着在设置指定的位的同时,会清除事件组中其他所有位。要等待位0和/或位1和/或位2被设置,可以设置为。,则函数将在所有指定的位都设置时返回。
2025-02-08 20:28:41
264
原创 递归互斥量应用与理解
Task3是否能与Task1交替运行,主要取决于它们的优先级设置。互斥锁主要用于同步对共享资源的访问,而不是直接影响任务的调度和执行顺序。如果Task3需要访问由Task1保护的资源,它应该实现适当的同步机制,以避免数据竞争和不一致。
2025-02-08 19:48:52
304
原创 freeRtos互斥信号量的优先级继承机制
在FreeRTOS中,当一个任务持有一个被其他任务请求的互斥锁(mutex)时,如果这些请求任务的优先级高于持有锁的任务,就可能发生优先级反转问题。当一个高优先级任务试图获取一个已经被低优先级任务持有的互斥锁时,它会被挂起(即放入等待队列)。如果有多个任务在等待同一个互斥锁,只有最高优先级的任务会使得持有锁的任务继承其优先级。持有互斥锁的低优先级任务会继承请求锁的最高优先级任务的优先级。一旦低优先级任务释放了互斥锁,它将恢复到原来的优先级。(最低优先级)持有的互斥锁,按照优先级继承协议,
2025-02-07 20:41:00
293
原创 esp32-s3 vscode下无法打开menuconfig解决办法
只要在configextention界面选择advance版在本地找idf,然后安装耐心等待(网速非常非常非常重要,基本上就是网络问题会导致最后一步的python环境搭建失败)归根结底是python环境的问题(现在成功打开)
2025-01-30 10:58:13
318
原创 esp32-S3无法调试,报错”未能找到设置“idf.customExtraPaths:“的解决办法
第三步:在settings.json中新建"idf.customExtraPaths":然后将路径复制在后面,并注意修改成双斜杠(每个人的路径不一样);并修改"idf.openOcdConfigs":处的值(如下图)。第四步:解决c_cpp_properties.json报警告的问题;直接复制以下代码粘贴即可。第一步:打开powershell。第二步:复制产生的路径。
2025-01-26 09:07:07
1279
原创 esp32-S3正点原子开发板,IO扩展芯片使用
原本是用开发板上的按键写几个中断控制oled但写好中断初始化代码后才发现按键连接的是扩展芯片的p15,p14,p13,p12引脚,导致按了半天没反应。后来通过提供的exio例程才初始化成功。IO扩展芯片INT引脚使用的中断线初始化。2、对应IO扩展芯片上的引脚。
2025-01-24 15:15:40
293
原创 esp32-S3多引脚外部中断
1.gpio_isr_handler_add()一次只能设置一个引脚的中断回调,但是中断函数只需要一个就行。2.gpio_intr_enable()一次只能使能一条中断线。
2025-01-24 13:12:41
281
原创 esp32-S3移植江协oled驱动代码和引脚GPIO开漏输出配置
* 失能引脚中断 *//* 配置GPIO *//* 失能引脚中断 *//* 配置GPIO */gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;
2025-01-23 20:24:33
563
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人