- 博客(265)
- 资源 (28)
- 收藏
- 关注
原创 Cortex-M3 main函数堆栈、中断堆栈、线程堆栈什么时候用?
main函数堆栈:在离开复位状态后,CM3做的第一件事就是读取下列两个32位整数的值: 1、从地址0x0000 0000处取出MSP的初始值(__initial_sp)。 2、从地址0x0000 0004处取出PC的初始值,这个值是复位向量,LSB必须是1。 然后从这个值所对应的地址处取指。 硬件自动从0x0000 0000位置处读取数据赋给栈指针sp,然后从0x0000 0004位置处读取数据赋给pc指针,完成复位,结果为:SP = 0x20
2024-12-27 15:51:22
176
原创 Cortex-M3启动过程(从上电->分散加载->main函数)
(由此我们知道,中断函数的函数名都已经知道了,我们在写对应的中断服务程序时,从对应的地址取服务例程的入口地址并跳入执行)。向量表中的数值是 32 位的地址,而不是跳转指令。Stack_Size EQU 0x00000400,这个语句相当于Stack_Size这个标号(标号:链接器的术语,下文中提到的所有“标号”,指的都是指的链接器中的标号)等于0x00000400相当于C语言中的#define Stack_Size 0x00000400 ,也就是说此语句只是一个声明,并未分配地址。
2024-12-27 14:47:27
705
原创 STM32从上电开始启动过程详解(上电->分散加载->main函数)
将section 拷贝到对应的执行域地址执行,(把RO RW从加载域拷贝到执行域,如果有压缩的Section 会进行解压缩并进行拷贝)通俗点来讲__main函数初始化运行态的环境,主要的功能就是做分散加载将Code位置搬运正确,才能正常运行Code。来看看具体的分散加载代码,是如何搬运data 和初始化bss段的。armcc 手册里面介绍:__main 和 __rt_entry 是初始化运行态的环境,以及后面运行APP程序。值等),最后由__main 函数调用用户写的 main()函数开始执行 C 程序。
2024-11-15 16:37:53
717
原创 LWIP通信协议UDP发送、接收源码解析
1.UDP发送函数比较简短,带操作系统和裸机一样。以下是udp_sendto源码解析;2.1.UDP带操作系统接收数据,以下是源码解析;2.2.UDP裸机接收数据,以下是源码解析。2.LWIP源码UDP接收数据。
2024-11-05 15:13:56
1242
2
原创 C语言的*与++的优先级关系
前缀递增递减和*优先级相同,从右到左;后缀递增递减比前缀优先级高,从左到右。比如 1 2 intarr[5]={1,3,5,7,9}; int*p=arr; *++p:p先自+,然后*p,最终为3——马上改变指针,*下一个指针*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1] ————之后改变指针,*原数据,指针++*(p++):效果等同于*p++ ——之后改变指针,*原数据,指针...
2022-05-20 14:44:26
3895
转载 C运算符优先级完整口诀
C运算符优先级完整口诀C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。■“单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*);■“算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);■“移”表示按位左移(<<)和位右移(>>);■“关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==
2022-05-20 14:33:55
5723
原创 C语言实现小数四舍五入的2种方法
方法1:编程实现C语言中实现四舍五入:(int)(a+0.5)即可。很巧妙的用了取整规则。也不用导入math.h同样注意负数的情况。把 + 换成 - 即可。float f = …..;int i = (int)(f + 0.5);i就是f四舍五入的结果。今天我要介绍在C语言中实现数据四舍五入的算法。我们知道,C语言中去除小数位采用的方法就是强制性转化成整型类型。那么假如我们要对一个小数保留三个小数位而第四个小数位按照四舍五入的规则进行,该怎样实现呢?很简单,我们将数字扩大1000
2022-04-26 14:51:24
23064
2
原创 Cotex-M内核双堆栈指针MSP和PSP
MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13;权威手册上说的很清楚PSP主要是在Handler的模式下使用,MSP主要在线程模式下使用(当然你在线程模式下也可以调用PSP,需要你做特殊的处理);这意味着同一个逻辑地址,实际上有两个物理寄存器,一个为MSP,一个为PSP,在不同的工作模式调用不同的物理寄存器。Cortex-M3内核有两个堆栈指针:MSP-主堆栈指针和PSP-进程堆栈指针,在任何一个
2022-01-11 15:24:20
2924
原创 你真的理解了const和volatile关键字么?(我看不一定)
一、总结 1、const使得变量具有只读属性(但是不一定就是不能更改) 2、const不能定义真正意义上的常量(因为有的用const定义的变量,仍然可以更改) 3、const将具有全局生命期的变量存储于只读存储区(这个是对现代编译器是这样的,但是对ANSI编译器,仍然可以更改) 4、volatile强制编译器减少优化,必须每次从内存中取值 5、const修饰的变量不是一个真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边...
2020-12-24 20:34:34
359
1
原创 arm 基础:详解C中volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;void test(){ do1(); while(flag==0); do2();} 这段程..
2020-12-24 20:30:26
618
1
原创 表驱动优化代码、加速程序执行效率(函数指针)
上一节解读了C程序中函数指针及回调函数的写法,本节再看一下函数指针另一个较为广泛的应用-驱动表程序,在这之前,首先需要了解函数指针数组的使用,依旧通过最简单最容易理解的例子来讲解。 首先看下面这个函数指针数组的使用实例。 #include <stdio.h> #include <stdlib.h> int Sum(int a, int b) { return a + b; } ...
2020-12-05 14:22:27
914
转载 解析STM32的启动过程
原文地址:http://www.openedv.com/forum.php?mod=viewthread&tid=56872&highlight=stm32%2B%C6%F4%B6%AF当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为
2020-10-23 11:35:11
343
转载 Cortex-M3 双堆栈指针(MSP&PSP)
【双堆栈指针(MSP&PSP)】Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个。 复位后处于线程模式特权级,默认使用MSP。 通过SP访问到的是正在使用的那个指针,可以通过MSR/MRS指令访问指定的堆栈指针。 通过设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针。CONTROL[1]=0选择主堆栈指针;CONTROL...
2019-12-27 10:02:32
4321
原创 GCC连接器--动态库(Shared Library)中 PLT 和 GOT 的使用机制
PLT (Procedure Linkage Table) 和 GOT (Global Offset Table) 是 GCC 中生成shared library的重要元素。至于为何一定要这两个表?GOT的功用以gcc內建的libc.so 为例,因为你不可能用到libc.so 里面所有的函数,所以其实不用知道所有函数在内存的绝对位置。其中GOT只列出你会用到的function 或者是 gl...
2019-12-19 15:04:00
3808
1
原创 STM32-移植FATFS的NANDFLASH驱动
1,在http://elm-chan.org/fsw/ff/00index_e.html上下载ff007c.zip,并把ff007c.zip里面的src文件夹复制到D:\works\EK-STM3210E-UCOSII下,并改名为Fatfs;2,在IDE工程中右击选择“Add Group”建立“FATFS”文件组,并在“FATFS”上右击选择“Add Files”添加D:\works\...
2019-10-21 11:39:42
3404
4
原创 Nand flash基本原理
1. 闪存存储单元 对于闪存,我们常见的有SLC和MLC两种,细分还有eSLC和eMLC等,因为闪存式一种电压元件,因此它是以不同的电压范围来代表不同的数据,现在看看两者之间的区别。 1) SLC(single-level cell):单阶存储单元,也就是闪存的每一个存储单元存储1bit的数据,存储的数据代表0还是1是基于vth的电压阈值来判定,对于闪存写入,就是对其进行充电,使得它的...
2019-10-21 11:23:50
4606
转载 fatfs结构及源码分析。
目录一、API的函数功能简述二、FATFS主要数据结构 1、FAT32文件系统的结构 2、FATFS主要数据结构 ①FATFS ②DIR ③FIL ④ FILINFO ⑤win[512] ⑥buffer三、函数功能与实现详细分析 0、move_window 1、f...
2019-10-11 15:21:39
3006
转载 STM32的ITM跟踪调试功能介绍及实现(一)KEIL篇
ITM,(英文:Instrumentation Trace Macrocell,指令跟踪宏单元),是一种针对MCU进行跟踪调试的新方法,与打断点(Breakpoint)不同,ITM方法不需要暂停程序运行,可以在程序全速运行的过程中实时输出变量的数值以便观察,即Trace功能。对于有一定产品开发经验的工程师而言,会马上意识到ITM的独到用处:调试跟“通讯”有关的代码将非常有用,后文将介绍一个调试US...
2019-10-11 09:26:47
10230
2
原创 uC/OS任务创建函数OSTaskCreate ()参数详解
要使用uC/OS的任务必须先声明任务控制块和创建任务,调用OSTaskCreate ()函数可以创建一个任务。OSTaskCreate ()函数的信息如下表所示。
2019-06-26 09:57:31
4879
转载 f_sync解决fatfs文件掉电数据丢失问题
临界段When write operation to the FAT file system is interrupted due to any accidental failure, such as sudden blackout, incorrect disk removal and unrecoverable disk error, the FAT structure can be co...
2019-03-14 16:57:45
4084
原创 Fatfs 函数功能简介
【文件系统将对文件的块的操作转换为对物理存储器扇区的各种操作】 FatFs是一个通用的文件系统模块,以小的嵌入式系统的FAT文件系统。 FatFs的编程遵守的ANSI C格式语法标准,因此,它是具有独立于硬件架构。 在不做任何改变就可以被移植到常用的微控制器中,如8051, PIC, AVR, SH, Z80, H8, ARM等。 FatFs 特点分离缓冲的FAT结构和每一个文件...
2019-01-23 11:38:58
3336
原创 网口扫盲三:以太网芯片MAC和PHY的关系
问:如何实现单片以太网微控制器?答:诀窍是将微控制器、以太网媒体接入控制器(MAC)和物理接口收发器(PHY)整合进同一芯片,这样能去掉许多外接元器件.这种方案可使MAC和PHY实现很好的匹配,同时还可减小引脚数、缩小芯片面积.单片以太网微控制器还降低了功耗,特别是在采用掉电模式的情况下.问:以太网MAC是什么?答:MAC即Media Access Control,即媒体访问控制子层协...
2018-12-05 16:10:59
1941
转载 stm32之can总线过滤器的标准帧、扩展帧、远程帧等
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE
2017-06-02 18:28:25
14427
4
转载 CAN通信详解
本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:30.1 CAN简介30.2硬件设计30.3软件设计30.4下载验证30.1 CAN简介CAN是Controller Area Network的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽
2017-04-11 16:59:34
57511
3
原创 FATfs文件系统移植-文件更改记录
FatFS是一种开源的文件系统格式,移植方便,容易使用。最近开始玩STM32,玩到了SD卡部分,准备移植FatFS到SD卡上并解决驱动问题,一开始使用的是SPI带SD卡,这部分解决后就可以再着手进行SDIO模式。下面是关于FatFS文件系统移植需要的几个关键文件: ff.c(不动) 文件系统的实现代码,里面主要是FatFS文件系统源码,移植的时候不需要修改 ...
2017-04-10 14:22:36
902
原创 Linux 文件系统理解
1.ext2文件系统整体布局一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。下图是一个磁盘分区格式化成ext2文件系统后的存储布局。or如下第二种图(追加的图hanchaoman):文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定...
2017-03-24 09:22:27
1324
原创 STM32 GPIO管脚配置意思说明
1 STM32205XX系列每个通用I/O 口都 1) 有4 个32 位配置寄存器 (GPIOx_MODER,GPIOx_OTYPER, GPIOx_ OSPEEDR 和GPIOx_PUPDR),2)2 个32 位数据寄存器(GPIOx_IDR and GPIOx_ODR) 3)1 个32 位置位/ 复位寄存器(GPIOx_BSRR)。4) 口A 和口B 还含有1
2016-12-23 15:42:11
2773
转载 SD 移植fatfs文件系统
为SPI FLASH移植fatFs文件系统心得 (二)喻时耕宇1 年前今天算是移植成功了,由于下载的是最新的fatFs,网上资料基本都是以前的系统。有些地方还是改动比较多的,这里全部列出来。FRESULT f_mkfs ( const TCHAR* path, /* Logical drive number */ BYTE opt, /* Format optio
2016-12-09 11:08:21
1401
转载 FATfs源码解析
一、介绍:本文以网上开源文件系统FatFs 0.01为研究对象,剖析FatFs文件系统的核心操作。FatFs目前最新版本已更新到0.10a版本,而我之所以选择0.01版本,是因为这是最早的发布版本,与最新的版本相比,去掉了很多高级应用,且代码量相对较小,宏开关也少了许多,易于阅读和理解,用来研究它的雏形再合适不过了,所以笔者选择0.01版本进行剖析。当大家了解了0.01的核心思想后,再回去
2016-11-03 16:17:05
3390
1
转载 uCOS时钟节拍和滴答定时器的关系
在使用uCOS时,有一个非常重要,非常关键的概念就是操作系统的时钟节拍,uCOS的时钟节拍来源于滴答定时器,滴答定时器按照设定的时间不停的计时和产生中断,在uCOS-III中滴答定时器的中断服务函数如下:void OS_CPU_SysTickHandler (void){ CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); O
2016-09-19 13:41:13
2044
1
转载 keil开发环境增加Gnu扩展
不得不说Keil貌似是国内用户使用最多的IDE了,其被ARM收购之后,ARM嵌入了ARMCC等编译器推出了Keil MDK开发环境更是受到了广大ARM开发工程师的欢迎,庞大的用户群(很多是从当年的51等8位机直接转过来的)、简洁的管理窗口和友好的UI界面等优势都让其风靡一时,而且毕竟现在成了ARM的“亲儿子”了,其对ARM内核的产品支持还是灰常不错的。而GCC更是大名鼎鼎,这个
2016-06-15 11:46:05
8415
转载 C语言一些常用的“位”操作函数
这些函数操作“位”,经常用到:[cpp] view plain copy print?//将双字节中某一位置位 void SetN1(unsigned short *pBuf, int n) { (*pBuf) |= 1} //将双字节中某一位清零 void SetN0(unsigned short *pBuf, int n) {
2016-02-18 19:12:34
1969
原创 stm32 中DMA的stream和channel关系
问:STM32(意法)DMA中的stream和channel到底什么关系和区别?答:拿stm32的DMA1做例举。DMA1中总共有8个stream,而每个stream可以配置成不同的传输源和目的地址,这就是channel。1个不同的源和目的就叫1个channel。如下图所示:上图中stream0可以被配置成channel 0、1、2、3、4、6。配置成channel0时用spi3_r...
2015-09-18 17:20:29
9330
转载 你所不知道的TCP/IP传输层
PS.老规矩,列出可能遇到的20个问题,如果您是都能回答的高手,请您绕道,我是小菜,只做自己的学习笔记。 1. 传输层的主要功能是什么?2. 传输层如何区分不同应用程序的数据流?3. 传输层有哪些协议?4. 什么是UDP协议?5. 为什么有了UDP,还需要TCP?6. 什么是TCP协议?7. 怎么理解协议和程序?8. TCP是否真的有链接?9. 链接
2015-08-17 11:10:18
906
转载 vmware三种连接方式Bridge、Host-Only模式和NAT模式
本地连接:是本机用Bridge方式与虚拟机交互时使用的主机网卡;VMware Network Adapter VMnet1:是本机用Host-Only方式与虚拟机交互时使用的虚拟网卡;VMware Network Adapter VMnet8:是本机用NAT方式与虚拟机交互时使用的虚拟网卡;接下来是试验结论:1、Bridge模式:Bridge模式使用的网卡是
2015-03-22 20:57:45
1309
转载 libxml2库函数详解
许多事物符合80/20法则,libxml中也是20%的函数提供了80%的功能。下面的列表列出了libxml的主要函数及其用法说明。1. 全局函数说明头文件引用xml2config --cflags库文件引用xml2config --libs主要头文件parse.h
2015-01-09 17:06:32
13064
转载 socket绑定INADDR_ANY,那会怎样?(例如:双通机房多网卡多IP设置)
我也回复一个!!其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地
2015-01-06 13:03:46
3264
转载 linux线程的取消(终止)
关键:pthread_cancel函数发送终止信号pthread_setcancelstate函数设置终止方式pthread_testcancel函数取消线程(另一功能是:设置取消点)1 线程取消的定义一般情况下,线程在其主体函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。2 线程取消的语义线程取消
2014-12-30 10:32:07
11875
原创 CAN总线疑惑与解答
1 CAN总线2根数据线是怎么表示数据信息1和0的?Can总线采用差分数据表示方法,平时2个数据线为2.5V,表示隐性(1)。当用数据0(显性)需要发送时1跟数据线上升到3.5V另一个下降到1.5V。如图a所示所有节点都连接到这两根数据线,当所有节点都发送数据为隐性时总线数据才表示为隐性,如果有其中一个节点发送数据显性则总线数据表示为显性。数据仲裁也就是基于这样一个特点仲裁的。
2014-12-01 11:29:30
5483
sscom5.13串口调试工具
2023-03-27
sttoolset-STM32读写HEX工具
2023-03-27
CmBacktrace开源代码,亲测可用
2023-03-27
PT1000 分度表C语言代码
2020-12-29
STM32_OS.zip
2020-06-17
Quartus_13.0_WinXp_32bit破解器
2013-06-24
Linux-C-编程一站式学习
2012-09-03
python教程pdf合集
2012-03-18
C语言函数速查手册--标准库函数
2010-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人