嵌入式软件基础知识点

本文探讨了C++中的setjmp()和longjmp()函数用法,结构体联合体的内存布局,进程状态的控制,C++继承关系,数组指针的应用,链表灵活性,以及大端和小端字节序的区别,还涉及优先级管理和SPINSS的软件硬件配置,以及符号运算中的类型转换问题。
摘要由CSDN通过智能技术生成

setjmp()与iongjmp()

setjmp() 函数用于保存当前函数执行的上下文,同时返回一个 int 类型的值。这个值由 setjmp() 函数自动生成,用于之后调用 longjmp() 函数时确定跳转目标。

longjmp() 函数用于从之前保存的上下文中恢复执行状态,并跳转到指定的位置。它接受两个参数:一个是之前由 setjmp() 函数返回的值,用于确定跳转目标;另一个是一个整数值,用于指定 setjmp() 函数的返回值。

结构体 联合体总空间大小

结构体的总空间大小可能会大于成员总长度,这是因为编译器会在结构体中添加一些额外的空间,用于对齐结构体成员。这种额外的空间被称为“填充字节”,它可以提高结构体成员访问的效率。联合体的空间大小等于最大成员占据的空间,这是因为联合体中所有成员共享同一块内存空间。因此,联合体的大小必须足够容纳最大的成员。

进程状态切换

C++继承关系

 数组指针

#include <stdio.h>
int main(void){
	int a[5] = {1,2,3,4,5};
	int *ptr = (int*)(&a+1);
	printf("%d\n",*(a+1));
	printf ("%d\n",*(ptr-1));
 	return 0;
}

&a是指向整个数组的指针。将其加1会将其移动到数组结束后的内存位置。

链表类型

在同一个链表上,所有包含链表节点的数据类型可以不一致

大端(big endian) 小端(little endian)

举个例子说明,我的机子是32位windows的系统,处理器是AMD的。对于一个int型数0x12345678,为方便说明,这里采用16进制表示。这个数在不同字节顺序存储的CPU中储存顺序如下:

0x12345678   16进制,两个数就是一字节

高有效字节——>低有效字节: 12 34 56 78

          低地址位     高低址位

大端:  12  34        56   78

小端: 78  56        34   12

防止优先级翻转

优先级继承和优先级天花板,目的都是使得到信号量的任务的优先级,不低于其他在等待该信号量的任务的优先级,由此,当该任务释放资源后,任务结束前,也不会被其他较高优先级任务抢占,也就保障了如果有高优先级任务在等待该资源,那么该任务结束后高优先级任务立即就可使用该资源。

优先级继承

当一个任务阻塞了若干个任务时,若阻塞任务有高优先级任务,则将所有阻塞任务中的最高优先级作为其优先级

优先级天花板

给每个信号量设置一个优先级天花板,优先级天花板的值大于所有使用该信号的任务的优先级,当某个任务得到该信号量时,将其优先级置为优先级天花板的值。

SPI的NSS 软件 硬件配置区别

在调用SPI_Init配置SPI主机时,我们将SPI_Mode设置为SPI_Mode_Master,并将SPI_NSS设置为SPI_NSS_Soft即可。这其中的原理是什么呢?
根据SPI_Mode_Master和SPI_NSS_Soft的宏定义,实际上这两个参数将SPI_CR1寄存器的第2、8、9位设置为了1。位2是主设备选择位,查手册可知要配置为主机,显然要将此位置1。但仅配置这一位是不够的,上面提到NSS引相当于CS引脚的作用,在配置为主设备时,需要将其接高电平。一种方法是硬件上直接接高电平,也就是在芯片的外部把PA4引脚接到高电平。而我们这里的配置则采用了软件上的方法。CR1寄存器的第九位SSM实际上就决定了是通过软件的方法来配置NSS引脚的电平还是通过硬件的方法来配置NSS引脚的电平。我们使用的SPI_NSS_Soft 宏就是将第九位置位,选择使用软件方法将NSS引脚接高电平。
那么软件方法是什么意思?软件方法就是在我们把SSM位置位后,芯片外部的PA4引脚输入的电平就不再影响NSS引脚最终获得的电平,NSS引脚与CR1寄存器的第八位(SSI)自动进行了关联。NSS引脚的电平将由SSI位来决定。当SSI位置1时,就相当于给NSS引脚接了高电平,当SSI位置0时,就相当于给NSS引脚接了低电平,也就是说我们完全可以通过编程操作CR1寄存器的SSI位来实现将NSS引脚接到高电平,而无需在芯片外部进行实际电路的连接。我们调用SPI_Init函数时,SPI_Mode_Master宏将SSI位置1,因此这个宏相当于给NSS接了高电平,将这个SPI设置为了主机。

符号运算

	int a = 3;
	unsigned int b = -6;

① 当一个int类型的a与unsigned int类型的b相运算时,例如:a+b的时候,如果直接是a+b的话,各个变量就会隐式转换成为unsigned int的类型再相加。

② 当用print函数指定打印的时候,例如:printf(”%d\n”,a+b),就要各个变量转换为%d的类型再想加。

③ 当用一个int c类型去装这个结果时,如:c=a+b,同理,a和b会根据c的类型去分别转换跟c一致的类型再去运算。

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值