目录
1、TCM
1.1、代码放置在ITCM的方式
__attribute__ 的函数属性
__attribute__ 的变量属性
__attribute__ 的类型属性
__attribute__ 的优化控制属性
1.2、DTCM
1.3、TCM的使用注意事项
1、TCM
CM=Tightly Coupled Memory,是一种高速缓存,据说是被直接集成在CPU芯片中。
有两种TCM,分别是ITCM(Instruction TCM)和DTCM(Data TCM)。
ITCM是cortex内核中指令传输总线,DTCM是cortex内核中数据传输总线。是cpu内核同flash及sram之间传输指令和数据的通道,指令的取指和执行及数据的读写在性能及管理上存在差异性,因而需要予以区分。
由于是高速缓存,所以这两块内存区域被当做特殊的用途。比如某些对时间要求非常严格的代码,就可以被放到ITCM中执行。这可以有效地提高运行速度。某些需要频繁存取的数据,也可以放到DTCM中以节省存取时间。
1.1、代码放置在ITCM的方式
怎么样把代码放到ITCM中?有两种方法。一种是使用gcc特有的“属性标签”,将指定代码赋予“ITCM”属性,此时该代码会被载入ITCM中执行。还有一种方法是直接将.c源文件改成.itcm.c,此时源文件会被直接编译成在ITCM中运行的目标文件。
注意:gcc特有的“属性标签”指__attribute__
__attribute__ 是 GCC 编译器提供的一种机制,用于给编译器提供关于函数、变量、类型等方面的额外信息,以便于编译器进行更好的优化或产生更符合开发者期望的代码。以下是 __attribute__ 的一些常见用法:
__attribute__ 的函数属性
1、noreturn: 指示函数不会返回,比如在函数内部使用 exit() 或 abort()。
void my_function() __attribute__((noreturn));
2、deprecated: 标记函数为废弃的,提示开发者不再使用这个函数。
void old_function() __attribute__((deprecated));
3、constructor 和 destructor: 指定构造函数和析构函数的执行顺序。
void my_constructor() __attribute__((constructor));
void my_destructor() __attribute__((destructor));
4、packed: 强制按照最小字节对齐方式对齐结构体。
struct __attribute__((packed)) my_packed_struct
{
// structure fields
};
__attribute__ 的变量属性
1、unused: 防止编译器发出未使用变量的警告。
int my_variable __attribute__((unused));
2、aligned: 指定变量的对齐方式。
int my_aligned_variable __attribute__((aligned(16)));
__attribute__ 的类型属性
1、may_alias: 允许通过指针访问对象时,将其视为任何类型。
typedef int my_type __attribute__((may_alias));
__attribute__ 的优化控制属性
1、optimize: 控制特定函数的优化级别。
void my_function() __attribute__((optimize("O2")));
1.2、DTCM
而DTCM就方便得多了。虽然两个TCM都是可映射的,也就是说,它们的地址并非固定,但是一般会将其分别映射到固定地址。既然已经有了固定地址,那么就可以很轻松地访问了。不过,正如刚才所说的,这两块内存空间都是有特殊用途的,所以不建议直接访问。相比于ITCM来说,DTCM更加重要。因为在这块内存中,存在着一个非常重要的对象——栈。局部变量和函数调用的参数,就是靠栈进行传递的。由于DMA无法访问TCM,所以也就无法访问栈。又由于局部变量是被开辟到栈中,所以DMA也无法对局部变量进行传递。
Cortex-M7内核可以按顺序访问这些内存:
ITCM
DTCM
I-cache
D-cache
ITCM和DTCM可以通过32位的AHBS接口访问,以引导的ITCM中的指令,例如,不同的Cortex-M7内核、eDMA等,EMAC是另一个可以访问DTCM的主机。
访问超出在芯片上可用的RAM的SRAM,终止总线周期,在这个芯片中使用的请求总线主存储器类型中的一个适当的响应后面跟着错误。
1.3、TCM的使用注意事项
在进行读访问之前,必须先对TCM (ITCM和DTCM)和系统RAM进行初始化通过64bit的写入。系统RAM可以使用eDMA和CPU核心进行初始化。ITCM初始化只能由内核使用直接访问或后门访问来执行。DTCM也可以通过使用core的直接和后门访问或eDMA执行32位写操作来初始化。这些写操作是在芯片上电复位后设置初始ECC码字所必需的。
AIPS-Lite外设桥内存映射
可以通过crossbar交叉开关矩阵从端口访问外设内存映射。下表显示了与外设地址空间相关的三个外设桥区域。
通过MC_CGM寄存器中的时钟脉冲控制字段禁用功能的模块禁用相关的AIPS_Lite插槽。
访问未实现或禁用的外设桥地址范围内的任何地址将导致传输错误终止。
内存操作
在特殊情况下,必须在后续操作发生之前完成对外设的写入过程。这种情况的包括一下三种:
退出中断服务程序
更改模式
配置功能
在上述这些情况下,必须执行先写后读顺序来实现所需的内存顺序操作。
写入相关的外围寄存器。
读寄存器,验证写进程。
继续执行后续操作。
/*************************************************未完待续*******************************************/