嵌入式C语言基础补充

嵌入式C语言核心概念解析

一、指针的原理

在Soc芯片内部,长这样

RAM:起暂存的作用。
Flash:像读 RAM 一样读 Flash,但是不能像写 RAM 一样写 Flash(要先擦除才能
执行特定的操作去烧写)。
如下代码示例
01 int a;
02 int *p;
03 p = &a;
04 *p = 1; // 相当于 a = 1
其中,a、p 都是“变量”,可以读可以写,执行第 1、2 行代码时,会在 RAM 里分配 2 个区域存放变量 a、p,如图
执行第 3 行代码时,p 变量所在的内存,里面的值等于 addr1,如图所示:
执行第 4 行代码时,使用 p 的值(addr1)作为地址来写内存,写入数值 1,就是让地
址为 addr1 的内存,即变量 a 的值等于 1。如下图所示:

二、指针变量的大小

首先说明,1字节(byte)=8字(bit)
char c; // 大小为1字节
short b; // 大小为2字节
int a; // 大小为4字节
long i; // 对于32位处理,大小为4字节;对于64位处理器,大小为8字节
char *p1; // 指针用来保存地址,无论是何种指针,对于32位处理器,指针变量的大小都是4字节
short *p2; // 指针用来保存地址,无论是何种指针,对于32位处理器,指针变量的大小都是4字节
int *p3; // 指针用来保存地址,无论是何种指针,对于32位处理器,指针变量的大小都是4字节
long *p4; // 指针用来保存地址,无论是何种指针,对于32位处理器,指针变量的大小都是4字节

经常使用的类型

uint8_t // 实际上是unsigned char
uint16_t // 实际上是unsigned short
uint32_t // 实际上是unsigned int
uint64_t // 对于32位处理器,它是unsigned long long; 对于64位处理器,它是unsigned long

二、结构体

1.1.1结构体的引入

要描述 1 个人,他有名字、年龄、性别,可以如下定义变量:
char name[10];
int age;
int sex;
要描述 20 个人呢?可以如下定义数组:
char name[20][10];
int age[20];
int sex[20];
如果一个函数里,要传递一个人的信息可以这样写括号里面的内容叫形参
void print_info(char *name, int age, int sex);
如果人的信息非常多,就需要引入结构体
struct person {
 char name[10];
 int age;
 int sex;
};
定义 20 个人:
struct person persons[20];

传入信息:

void print_info(struct person p);

2.1.1结构体指针

例如:

01 struct person zhangsan;
02 struct person *p;
03 p = &zhangsan;

内存中如图:

让结构体指针,直接指向 GPIO 模块:
例如:
typedef struct
{
    uint32_t CRL;   // 配置低8位引脚模式
    uint32_t CRH;   // 配置高8位引脚模式
    uint32_t IDR;   // 输入数据寄存器(只读)
    uint32_t ODR;   // 输出数据寄存器
    uint32_t BSRR;  // 位设置/复位寄存器
    uint32_t BRR;   // 位复位寄存器
    uint32_t LCKR;  // 配置锁定寄存器
} GPIO_REGS;

GPIO_REGS *gpioa = (GPIO_REGS *)0x40011000;
gpioa->BSRR = (1<<13);

BSRR第十三位设置为1原理如下

指针变了 gpioa 的值是 0x40011000,BSRR 在“GPIO_REGS”里的偏移地址是 0x10,所
以“gpioa->BSRR”访问的是“0x40011000+0x10”,就是 GPIOA_BSRR 寄存器的地址。

三、位操作

位运算是指二进制位之间的运算。

1.1.1 逻辑移位

对于无符号型值,算术移位等同于逻辑移位;对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1

无符号类型的数值移位时是“逻辑移位”,“有符号”的数值移位时是“算术移位”。

示例逻辑左移

unsigned int a = 0x123; 
unsigned int b = a<<2; // b=0x48C

2.1.1把某几位设置为某值

把bit7设置为1,把bit8清除为0,分两步操作:先设置bit7,再清除bit8。

另一种情况: bit[8:7]= val, 先清除bit8, bit7,再或上val,
代码如下:
 

unsigned int a = 0x123;
unsigned int b = a & ~(3<<7); /* 清除bit7, bit8 */
b = b | (val << 7); /* 设置bit7, bit8为val */

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值