现在研一在读,明年想找嵌入式硬件开发的话,需要学些什么内容啊,之前学的都是偏软件方面的?
参考GPT和自己的思路:如果您想进入嵌入式硬件开发领域,需要学习以下一些内容:
总之,嵌入式硬件开发是一门综合性很强的学科,需要具备广泛的知识和技能。希望以上信息能够对您有所帮助。
嵌入式硬件开发是一种涉及硬件和软件的领域,需要掌握的技能包括:
1 硬件基础知识:掌握数字电路、模拟电路、微控制器、传感器、电源等方面的基础知识,了解各种电子元器件的特性及其作用。
2 嵌入式系统设计:掌握嵌入式系统的设计方法、原理和实现技术,熟悉各种嵌入式系统的组成部分,如处理器、存储器、外设、总线等。
3 编程语言:掌握嵌入式系统编程语言,如C语言、汇编语言等,了解各种编程语言的特点及其在嵌入式系统开发中的应用。
4 软件开发工具:掌握各种软件开发工具的使用,如Keil、IAR等,了解各种开发工具的特点、优缺点及其在嵌入式系统开发中的应用。
5 硬件设计工具:掌握各种硬件设计工具的使用,如Altium Designer、Proteus、Eagle等,了解各种工具的特点、优缺点及其在嵌入式系统开发中的应用。
7 系统调试技能:熟悉各种嵌入式系统调试技术,如调试工具的使用、仿真测试、调试流程等,能够快速定位并解决问题。
8 嵌入式系统安全性:了解嵌入式系统安全性相关的概念和技术,如加密算法、安全协议、漏洞分析等,掌握嵌入式系统的安全设计和实现方法。
以上是嵌入式硬件开发需要学习的一些基本内容,当然还需要不断深入了解和学习相关领域的最新技术和应用。
不知道你这个问题是否已经解决, 如果还没有解决的话:虚函数的发明初衷在于使得程序具有更好的通用性,从代码编写的角度看,其使用基类的指针指向子类的对象,并调用虚函数,使得根据指向的对象 而调用不同的子类函数,从而实现运行时多态(Runtime polymorphism
),这个特性与c语言中的函数指针回调非常相似,在c语言中,我们将函数指针作为参数传递给其他函数,然后调用,根据其指向的不同函数而产生不同的行为,c代码示例如下
#include <stdio.h>
typedef void(*func)(void);
void foo() {
printf("foo() called\n");
}
void bar() {
printf("bar() called\n");
}
void callback(void* fn) {
((func)fn)();
}
int main() {
callback((void*)foo);
callback((void*)bar);
return 0;
}
可见,callback()
函数根据传入的函数指针的不同使得其调用的函数不同,因此对于callback函数来说,其发生了运行时多态(Runtime polymorphism
),从汇编的角度看,其对应的汇编代码可以是
## call
call *%rdi <fn>
其中 %rdi
寄存器保存函数的第一个参数,*%rdi
表示寄存器存的是调用地址,此行汇编执行完后,栈空间将返回地址压入栈中,程序计数寄存器 pc的值将保存为%rdi
里的内容,控制转移至调用的函数中。
下面来看C++
中虚函数是如何实现多态的,先给出一个使用virtual
关键字的多态实现
#include <iostream>
using std::cout;
using std::endl;
class A {
public :
virtual void foo() {
cout << "A::foo() Virtual Table address : "
<<(void*)(*reinterpret_cast<int*>(this)) << endl;
}
virtual ~A() {
cout << "~A() Virtual Table address : "
<<(void*)(*reinterpret_cast<int*>(this)) << endl;
}
};
class B : public A {
public :
void foo() {
cout << "B::foo() Virtual Table address : "
<<(void*)(*reinterpret_cast<int*>(this)) << endl;
}
~B() {
cout << "~B() Virtual Table address : "
<<(void*)(*reinterpret_cast<int*>(this)) << endl;
}
};
int main() {
A* p = new B();
p->foo();
delete p;
return 0;
}
===========================================
output:
B::foo() Virtual Table address : 0x1fe2048
~B() Virtual Table address : 0x1fe2048
~A() Virtual Table address : 0x1fe2098
可以看到当析构函数定义为虚函数时,先执行子类B的析构函数,可以看到此时对象首地址4字节指向的是子类B的虚函数表,当调用父类 A的析构函数时,此时对象首地址4字节指向的是类A的虚函数表。因此析构过程大概如下