Day 01 学习总结
嵌入式学习的四个阶段
-
C语言
- 学习重点:
- C语言写代码的流程:
- 需求分析 - 确定程序目标。
- 理清思路 - 明确实现步骤。
- 代码编写 - 学习和使用 C 语言语法。
- 调试 - 解决错误,验证功能。
- 代码提交 - 学习版本控制工具(Git、SVN),代码托管平台(GitHub、Gitee)。
- C语言语法:
- 数据类型:
short
、int
、long
、float
、double
、char
。 - 变量、输入输出、流程控制语句(条件判断、循环)。
- 函数、数组、指针、结构体、宏定义等高级特性。
- 文件操作、链表等数据结构。
- 数据类型:
- 小项目:
- 图书管理系统、贪吃蛇、日历程序。
- C语言写代码的流程:
- 学习重点:
-
单片机
- 学习重点:
- 基础硬件控制:GPIO、串口、定时器、中断。
- 通信协议:I2C、SPI、ADC、DMA、蓝牙、WiFi。
- 上云(物联网平台接入)。
- 学习方法:
- 熟读芯片手册(如 STM32)。
- 模块化学习传感器和功能的实现。
- 产品开发流程:需求分析、选型、编程、调试、代码管理。
- 小项目:
- 智能家居、智能锁、无人机。
- 学习重点:
-
Linux
- 学习重点:
- 系统编程:文件操作、I/O、多线程、进程间通信。
- 网络编程:Socket。
- 驱动开发:内核裁剪与移植、根文件系统制作、外设驱动开发。
- C++、QT(用户界面开发)。
- 学习重点:
学习方法与心态
学习方法:
- 模仿:
- 理解代码的用途和写法。
- 自己动手写:
- 按照学习的思路自己尝试实现。
- 总结:
- 每天复盘,通过练习巩固知识。
- 项目实践:
- 综合应用知识,参与项目开发。
学习心态:
- 认可嵌入式行业:
- 清楚自己的目标,保持兴趣。
- 保持节奏:
- 不与他人攀比,掌握每日知识点即可。
- 主动拓展:
- 学习数据结构与算法等编程基础知识。
C语言学习
工具与基本框架:
- 使用
devcpp
或VS
工具创建.c
源文件。 - 基本
main
函数框架:#include<stdio.h> int main(void) { printf("hello world\n"); return 0; }
C语言语法要点:
-
数据类型:
- 整型:
short
(2字节),int
(4字节),long
(4/8字节),long long
(8字节)。- 有符号/无符号:
signed
/unsigned
。 - 范围:
unsigned short
: 0~65535signed short
: -32768~32767
- 浮点型:
float
(4字节, 6~10位有效),double
(8字节, 10+位有效)。
- 字符型:
char
(1字节),存储 ASCII 值。unsigned char
范围:0~255;signed char
范围:-128~127。
- 格式控制符:
short
->%h
int
->%d
long
->%ld
float
->%f
double
->%lf
char
->%c
- 整型:
-
变量:
- 定义格式:
数据类型 变量名;
。 - 全局变量未初始化默认为 0,局部变量未初始化为垃圾值。
- 赋值方式:
=
赋值符号。scanf
函数输入:int a; scanf("%d", &a);
- 定义格式:
学习作业
- 总结 数据类型、格式控制符 和 内存空间。
- 定义两个变量,输入数据,输出其和、差、积、商。
- 输出 2024年4月的日历。
- 设计一个程序,模拟购物卡买东西的流程。
C语言练习示例
作业 1:总结
- 数据类型:
short
、int
、long
、float
、double
、char
。 - 格式控制符:
%d
、%f
、%c
等。
作业 2:两数运算
#include<stdio.h>
int main(void)
{
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
printf("和:%d\n", a + b);
printf("差:%d\n", a - b);
printf("积:%d\n", a * b);
if (b != 0)
printf("商:%d\n", a / b);
else
printf("除数不能为零!\n");
return 0;
}
作业 3:日历程序
#include<stdio.h>
int main(void)
{
printf("2024年4月的日历:\n");
printf("日 一 二 三 四 五 六\n");
printf(" 1 2 3 4 5 6\n");
printf(" 7 8 9 10 11 12 13\n");
printf("14 15 16 17 18 19 20\n");
printf("21 22 23 24 25 26 27\n");
printf("28 29 30\n");
return 0;
}
作业 4:购物卡模拟
#include<stdio.h>
int main(void)
{
float card_balance = 1000.0; // 初始余额
float price;
printf("购物卡余额:%.2f\n", card_balance);
printf("请输入商品价格:");
scanf("%f", &price);
if (price <= card_balance)
{
card_balance -= price;
printf("购买成功!剩余余额:%.2f\n", card_balance);
}
else
{
printf("余额不足,无法购买!\n");
}
return 0;
}
补充
long
类型的大小(4 字节或 8 字节)取决于编译器、目标平台和数据模型的实现。以下是不同情况下 long
的大小:
1. 数据模型的影响
数据模型决定了基本数据类型的大小,包括 int
、long
和 pointer
。常见的数据模型如下:
数据模型 | int | long | pointer |
---|---|---|---|
ILP32 | 4 | 4 | 4 |
LP64 | 4 | 8 | 8 |
LLP64 | 4 | 4 | 8 |
- ILP32(32 位架构常见):
int
、long
和指针都是 4 字节。 - LP64(Unix 系统 64 位架构常见):
long
和指针是 8 字节,int
是 4 字节。 - LLP64(Windows 64 位架构常见):
int
和long
是 4 字节,指针是 8 字节。
2. 影响因素
(1)目标平台的位宽
- 32 位平台:
- 通常使用 ILP32 数据模型,
long
为 4 字节。
- 通常使用 ILP32 数据模型,
- 64 位平台:
- Unix/Linux(如 GCC 编译器)通常使用 LP64 模型,
long
为 8 字节。 - Windows(如 MSVC 编译器)通常使用 LLP64 模型,
long
为 4 字节。
- Unix/Linux(如 GCC 编译器)通常使用 LP64 模型,
(2)编译器的实现
- 不同的编译器可能会有不同的实现:
- GCC 和 Clang 在 64 位模式下遵循 LP64 模型,
long
为 8 字节。 - MSVC(微软编译器)在 64 位模式下遵循 LLP64 模型,
long
为 4 字节。
- GCC 和 Clang 在 64 位模式下遵循 LP64 模型,
(3)操作系统
- Unix 系统(Linux/macOS)大多采用 LP64 数据模型,64 位下
long
为 8 字节。 - Windows 系统通常采用 LLP64 数据模型,即使是 64 位,
long
仍为 4 字节。
如何检查 long
的大小?
您可以通过以下代码检查 long
的大小:
#include <stdio.h>
int main() {
printf("Size of long: %zu bytes\n", sizeof(long));
return 0;
}
总结
long
是 4 字节:- 32 位平台(常见的数据模型为 ILP32)。
- 64 位 Windows 系统(数据模型为 LLP64)。
long
是 8 字节:- 64 位 Unix/Linux 系统(数据模型为 LP64)。
理解 long
的大小差异对于跨平台开发至关重要,尤其在需要精确控制数据大小的场景中(如网络协议、文件格式)。
在 C 语言中,%zu
是 printf
格式说明符,用于输出 size_t
类型 的值。
详细解释
-
size_t
类型:size_t
是一种无符号整数类型,用于表示对象的大小(通常与平台相关)。- 它的大小通常等于目标平台指针的大小:
- 32 位系统:
size_t
通常是 4 字节(unsigned int
)。 - 64 位系统:
size_t
通常是 8 字节(unsigned long
)。
- 32 位系统:
-
%zu
的作用:z
是一个长度修饰符,用于表示与size_t
对应的类型。u
表示无符号整数(unsigned int
)。- 因此,
%zu
专门用来格式化输出size_t
类型的变量,确保在不同平台上格式正确。
为什么需要 %zu
?
- 不同的平台上,
size_t
的实际类型可能不同,例如:- 在 32 位系统上,
size_t
可能是unsigned int
。 - 在 64 位系统上,
size_t
可能是unsigned long
。
- 在 32 位系统上,
- 如果直接使用
%u
或%lu
,可能会导致格式不匹配,%zu
保证了跨平台的兼容性。
示例代码
#include <stdio.h>
int main() {
size_t size = sizeof(int);
printf("Size of int: %zu bytes\n", size);
return 0;
}
运行结果:
- 32 位系统:
Size of int: 4 bytes
- 64 位系统:
Size of int: 4 bytes
与其他格式符对比
%d
:输出有符号整数(int
)。%u
:输出无符号整数(unsigned int
)。%lu
:输出unsigned long
类型。%zu
:输出size_t
类型,专为对象大小设计。
总结
- 使用
%zu
是一种规范化的方式,用来输出size_t
类型,确保代码的可移植性和正确性。 - 推荐在涉及
sizeof
或内存相关操作时,使用%zu
进行输出。