[选读] 搭建开发环境

开发软件包

采用IAR9.3或者e2 studio编译器;

瑞萨编译器 e2 studio

  • setup_rznfsp_v1_0_0_e2s_v2022-07.exe其中已经集成FSP代码生成配置工具;

  • jlink11仿真器;

IAR编译器 IAR9.3

  • EWARM-9301-50054.exeIAR9.3编译器;

  • IAR9.3破解.rarIAR9.3破解工具;

  • setup_rznfsp_v1_0_0_rzsc_v2022-07.exe 瑞萨FSP代码生成配置工具;

  • i-jet仿真器;

RZ/N2L资源介绍

N2L

RZ/N2L快速选型

N2L-SC

系列芯片应用场景

03

支持的工业协议

04

225PIN T2M和N2L系统框图

04

markmap常用方法

markmap

POD类型的优势

编码规范:禁止定义静态存储周期非POD变量(constexpr变量除外),由于多编译单元中的静态变量执行时的构造和析构顺序的不确定性,它们会导致难以发现的bug。我们只允许POD类型的静态变量,即完全禁止vector(使用C数组替代)和string(使用const char[])。

1. C内存布局兼容

POD类型兼容C内存布局,C++可以直接使用C库函数操作POD数据类型,POD类型在C和C++间的操作总是安全的。

2. 可以使用字节赋值

POD类型可以直接使用字节赋值,使用C语言库函数进行二进制形式的数据交换,包括但不限于如下操作:

  • malloc创建

  • memset设置内存

  • memcpymemmove拷贝内存

3. 保证静态初始化的安全有效

静态初始化在很多时候可以提高程序性能,而POD类型的静态初始化非常简单(放入目标文件的.bss段,在初始化时直接赋0)

4. 其他特性

  • 虽然与C完全兼容,但是仍然可以有成员函数

  • 有更长的生命周期(从资源获取到资源释放),非POD类型的生命周期从构造函数结束到析构函数结束

  • POD类型对象的前部没有填充字节,因此对象指针等于对象第一个成员的指针

POD类型判断

在C++中,可以通过is_pod<T>::value来判断某个类型是否是POD类型。

POD类型的具体要求如下(这里只讨论类类型,即classstructunion):

1. trival

一个类类型是trival的需要满足如下条件:

默认指的是编译器自动生成的版本,用户定义的拷贝控制操作即使函数体为空也不算trival的,C++11以后可以使用=default显式使用编译器自动生成的版本。

  • 默认的构造函数与析构函数

  • 默认的拷贝构造函数和移动构造函数

  • 默认的拷贝赋值运算符和移动赋值运算符

  • 不能包含虚函数和虚基类

2. 标准布局

  • 所有非静态数据均为标准布局类型

  • 所有基类均为标准布局类型

  • 所有非静态成员具有相同的访问权限

  • 没有虚函数

  • 没有虚基类

  • 类中的第一个非静态成员与其任何基类的类型不同

  • 要么所有基类都没有非静态成员,要么最下层的子类没有非静态成员且最多只有基类有非静态数据成员(总之继承树中最多只能有一个类有非静态数据成员)

Reference

[1] https://zhuanlan.zhihu.com/p/45545035

[2] https://blog.csdn.net/kongkongkkk/article/details/77414410

[3] https://www.cnblogs.com/jerry-fuyi/archive/2020/05/09/12854248.html