程序员的自我修养-第三章
.
linux 环境下,可以使用 file 命令查看 elf 文件类型
目标文件一个简单的目标文件
文件头描述了文件的文件熟悉:是否可执行,目标硬件,段表等。段表描述了文件中各个段在文件中的偏移位置及段的属性等。
.text 保存编译后的机器代码
.data 保存已初始化的全局变量和局部静态变量
.bss 保存未初始化的全局变量和局部静态变量(局部变量会保存到栈中),.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间。
之后使用如下文件进行分析
使用 objdump 工具可以查看 object 文件的结构。(linux 下还有个工具 readelf 可以解析 elf 文件格式)
1objdump -h SimpleSection.o
与书籍内容类似:
他的 ELF 结构:
代码段objdump 的 -s 参数可以把所有段的内容以十六进制打印出来
objdump 的 -d 参数可以把所有包含指令的段反汇编
objdump -s -d SimpleSection.o
对比反汇编的开始和结束f3, ...
程序员的自我修养-第二章
。
从源文件到目标文件的整个流程1gcc hello.c
预处理(Prepressing)
编译(Compilation)
汇编(Assembly)
链接(Linking)
预处理(预编译)12gcc –E hello.c –o hello.i 或者cpp hello.c > hello.i
主要用于删除/替换宏定义,处理 #include 指令,删除注释,添加行号,文件名标识便于调试,保留 #pragma 编译命令
编译123gcc –S hello.i –o hello.s 或者cc1 hello.c(cc1可以完成预编译和编译)或者gcc –S hello.c –o hello.s
完成词法分析,语法分析,语义分析,优化后生成汇编代码文件。
汇编12as hello.s –o hello.o 或者gcc –c hello.c –o hello.o
一条汇编语言对应一条机器指令,汇编器要完成的任务很简单,将汇编指令翻译为机器指令就行了。(计算标号地址算么)
链接12例子:$ld -static /usr/lib/crt1.o /usr/li ...
程序员的自我修养-第一章
信号量与互斥量的区别
根本区别,互斥量用于线程的互斥,信号量用于线程的同步
互斥量只能为0/1,信号量可以为非负整数
互斥量的一组加锁和解锁只能在同一线程内使用,信号量可以在一个线程内释放,另一个线程内得到。
二元信号量也是信号量,主要保证线程的同步,但因为是二元的,只用0,1两个状态,也只能同时允许一个线程访问。从这一点上看与互斥量类型,但二元信号量与互斥量并不是完全相同,二元信号量终究是信号量,主要保证同步,可以在不同线程申请,释放,互斥量在哪个线程申请就在哪释放。
野火的freertos书中,有这样一段话:
二值信号量和互斥信号量(以下使用互斥量表示互斥信号量)非常相似,但是有一些细 微差别:互斥量有优先级继承机制,二值信号量则没有这个机制。这使得二值信号量更偏 向应用于同步功能(任务与任务间的同步或任务和中断间同步),而互斥量更偏向应用于 临界资源的访问。
c++基础1
比c增加的特性bool, namespace, cin, cout, cerr(这三个不是关键字,是运算符重载,cout带缓冲,cerr不带缓冲)
引用类似指针,修改变量是不用指针那么麻烦还要去找地址了,声明时就必须进行初始化。之后使用原变量,新引用都可以正常修改该地址下的值。
1234int a = 10;int &b = a;cout<<a<<" "<<b<<endl;cout<<&a<<" "<<&b<<endl;
a,b的地址都一样,可以把b看作a的别名。
const 与 指针基础情况const放在 * 的左边 指针变量所指向的数据不能通过指针变量改变,但指针变量是可以改变的
123456789int main(){ int a = 10; int b = 20; const int* p = &a; //等价于 int const* p = &a; p = &b; //指针变 ...
freertos-任务创建
硬件初始化定义一个bsp_init初始化函数,把初始化外设的函数都放到那里面去,
1234static void BSP_INIT(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LED_GPIO_Config(); //初始化led}
创建单任务——SRAM静态内存静态内存,即预先定义好的全局变量,这些变量保存值内部SRAM中。他们是运行前分配的,之前用ucos是就一直使用的是静态内存,
定义任务函数任务必须返回值,是死循环,要延时时,要使用freertos提供的延时函数,不能自己写一个for循环延时
123456789101112131415161718192021static void LED_Task(void* parameter){ while(1){ LED(ON); vTaskDelay(500); // 延时500个tick LED(OFF); vTaskDelay(500); // 延时500个tick & ...
freertos-移植
下载freertos源码FreeRTOS,准备一个stm32空工程。
解压后,FreeRTOS包含以下文件夹
demo:一些移植好的历程,包括stm32f103等,
license:略
source:源码,包括include(一些头文件),和portable(和编译器密切相关的文件,keil环境用RVDS)
将source下以.c结尾的文件移植到我们工程下面新建的src文件夹中,
将portable下MemMang文件夹和RVDS文件夹下cm3文件夹移植到我们工程下面新建的prot文件夹中,
将include文件夹移植到我们工程文件夹下。
拷贝freeRTOSConfig.s(demo工程下)到我们工程下
添加源码到工程组文件夹
指定头文件路径,主要是include文件夹,port文件夹和FreeRTOSConfig.h文件,
FreeRTOSConfig.h文件主要内容断言, freertos定义了一些断言接口 12#define vAssertCalled(char,int) printf("Error:%s,%d\ ...
test
。。。。。
本博客使用hexo框架搭配butterfly主题建立
首次建立博客主要参考了以下几篇文章:
GitHub+Hexo 搭建个人网站详细教程 - 知乎 (zhihu.com)
Butterfly 安裝文檔(一) 快速開始 | Butterfly
Markdown写作规范
建立过程中,遇到的最大的一个问题是typora的默认图片保存路径与hexo路径不符,导致图片无法显示,参考了这篇文章解决。
(8条消息) 解决:hexo+github本地和线上图片不显示问题_Donaghy的博客-CSDN博客
测试一下图片