✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
个人主页:嵌入式基地
系列专栏:嵌入式习题专栏
微信公众号:嵌入式基地
任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。
任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。
只有在任务中可以等待通知,而不允许在中断中等待通知。
如果任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态,我们可以将等待通知的任务看作是消费者;其它任务和中断可以向等待通知的任务发送通知,发送通知的任务和中断服务函数可以看作是生产者,当其他任务或者中断向这个任务发送任务通知,任务获得通知以后,该任务就会从阻塞态中解除。
1.局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
2.递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
3.指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。 解决这类问题的办法有两个, 一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。
深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。
主要包括4个过程:
- 预处理;
2.编译(产生.s文件,-s);
3.汇编(产生.o或者.obj文件,-c);- 链接
1.从数列中挑出一个元素,称为 “基准”;
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置;
3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;
< >引用的是编译器的类库路径里面的头文件,#include <> 的查找位置是标准库头文件所在目录;
" "引用的是你程序目录的相对路径中的头文件, #include “” 的查找位置是当前源文件所在目录。
CAN 是ISO国际标准化的串行通信协议。
CAN 控制器根据两根线上的电位差来判断总线电平。
总线电平分为显性电平和隐性电平,二者必居其一。
发送方通过使总线电平发生变化,将消息发送给接收方。
通信报文标识符有标准格式和扩展格式两种格式。
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。
1.在保证值域足够的情况下,用小字节变量代替大字节变量,如用short替代int
2.将各成员按其所占字节数从小到大声明,以尽量减少中间的填补空间(字节对齐)。
3.可以取消字节对齐,#pragma pack(1),当然这会牺牲效率,谨慎采用。