工具/软件:TI C/C++编译器
我看到了一种奇怪的行为、我很不理解:
我曾使用 Delfino 控制器、非常喜欢访问外设中寄存器和位的结构机制、我想我会尝试对6748 DSP 进行相同的访问。
因此、我创建了一个头文件、其中包含根据2000系列的完成方式定义 GPIO 寄存器和位的结构。 请参阅文件。
此外、我还制作了一个小测试文件、以了解其工作原理。 请参阅文件。
现在我们来看看奇怪的东西:
当我单步 执行"GPIOPinWrite (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、1)"和"GpioBanks.B6_7.set.bit.SETA6 = 1;"行时、我在计时器2中计算时钟脉冲时获得了两个非常不同的结果。
对于 TI 调用(GPIOPinWrite)、时钟脉冲数约为25至30、当我测试结构时、脉冲数为3至5。 看起来是一个巨大的改进:当使用结构方法时、速度提高了5倍。
好的、让我们在没有调试器的情况下实时尝试它:现在、事实证明 TI 调用速度更快(~40%?) 更好的方法。 不好。 我在 示波器上查看了实际的引脚 GPIO 6。
但是、与自由运行相比、使用调试器时、它的速度有多快?
有没有好的解释?
谢谢、
克劳斯·克努森
//代码
/* * main.c */ #include "psc.h" #include "SoC_C6748.h" #include "gpio.h" #include "pll_regs.h" #include "c6000 gpioStruct.h" #define GPIO_PIN_NUMBER (BANK、PINNR)(BANK * 16 + void 1)(piostruct)+ void 1 (p2+ pinstruct)(void 1)(void 1);gpioStart2 PSCModuleControl (SOC_PSC_1_regs、HW_PSC_GPIO、PSC_POWERDOMAIN_AYST_ON、 PSC_MDCTL_NEW_ENABLE); PINMUX14=0x00000080; //将引脚设置为 GPIO (6、6) GPIODirModeSet (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、GPIO_DIR_Output); ConfigandStartTimer_2 (); while (1) { TestGPIO_struct (); } #pragma DATA_SECTION (GpioBanks、"GPIO_REG"); 易失性结构 GPIO_Banks_0_8 GpioBanks; void TestGPIO_struct (void) { GPIOPinWrite (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、1);//步长 GPIOPinWrite (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、0);//步长 //使用结构两次以区分 TI 调用和结构 GpioBanks.B6_7.set.bit.SET6 = 1; GpioBanks.B6_7.CLR.bit.CLRA6 = 1; GpioBanks.B6_7.set.bit.SET6 = 1; GpioBanks.B6_7.CLR.bit.CLRA6 = 1; } void ConfigandStartTimer_2 (void) { TimerConfigure (SOC_TMR_2_regs、TMR_CFG_64BIG_CLK_INT); TimerPeriodSet (SOC_TMR_2_regs、TMR_TIMER12、0xFFFFFFFF); TimerPeriodSet (SOC_TMR_2_regs、TMR_TIMER34、0xFFFFFFFF); TimerEnable (SOC_TMR_2_regs、TMR_TIMER12、TMR_ENABLE_CONT); }
//结构
/*
* main.c
*
#include "psc.h"
#include "SoC_C6748.h"
#include "gpio.h"
#include "pll_regs.h"
#include "timer.h"
#include "C6000GPIOStruct.h"
#define GPIO_PIN_NUMBER (组、PINNR)(组* 16 + PINNR + 1)
void TestGPIO_struct (void);
void ConfigandStartTimer_2 (void);
int main (void){
PSCModuleControl (SOC_PSC_1_regs、HW_PSC_GPIO、PSC_POWERDOMAIN_AYST_ON、
PSC_MDCTL_NEW_ENABLE);
PINMUX14 = 0x00000080; //将引脚设置为 GPIO (6、6)
GPIODirModeSet (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、GPIO_DIR_Output);
ConfigandStartTimer_2 ();
while (1)
{
TestGPIO_struct ();
}
}
#pragma DATA_SECTION (GpioBanks、"GPIO_REG");
volatile struct GPIO_banks_0_8 GpioBanks;
void TestGPIO_struct (void)
{
GPIOPinWrite (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、1);//步长
GPIOPinWrite (SOC_GPIO_0_regs、GPIO_PIN_NUMBER (6、6)、0);//步长
//使用结构两次以区分 TI 调用和结构
GpioBanks.B6_7.set.bit.SET6 = 1;
GpioBanks.B6_7.CLR.bit.CLRA6 = 1;
GpioBanks.B6_7.set.bit.SET6 = 1;
GpioBanks.B6_7.CLR.bit.CLRA6 = 1;
}
void ConfigandStartTimer_2 (void)
{
TimerConfigure (SOC_TMR_2_regs、TMR_CFG_64BIG_CLK_INT);
TimerPeriodSet (SOC_TMR_2_regs、TMR_TIMER12、0xFFFFFFFF);
TimerPeriodSet (SOC_TMR_2_regs、TMR_TIMER34、0xFFFFFFFF);
TimerEnable (SOC_TMR_2_regs、TMR_TIMER12、TMR_ENABLE_CONT);
}
//链接器 CMD 文件
//===========================================================================================================================================
//链接 c674 DSP 程序的链接器命令文件
//
//这些链接器选项仅用于命令行链接。 对于 IDE 链接、
//应在 Project Properties 中设置链接器选项。
// 使用 C 惯例的-c 链接
// -stack 0x1000 软件堆栈大小
// -heap 0x1000 堆区域大小
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
-stack 0x3000
//-heap 0x2000
//===========================================================================================================================================
// 指定系统内存映射
//===========================================================================================================================================
存储器
{
L1P: O = 0x11E00000 l = 0x00008000
L1D: O = 0x11F00000 l = 0x00008000
L2: O = 0x11800000 l = 0x00040000
SHARGE_RAM:O = 0xC0000000 l = 0x00100000
DDR2: O = 0xC0100000 l = 0x07F00000
EMIFAB = 0x60000000 l = 0x02000000
GPIOMEM o = 0x01E26010 l = 0xC8
}
//===========================================================================================================================================
// 指定段分配到内存中
//===========================================================================================================================================
部分
{
.cinit > L2 //初始化表
.pinit > shared_RAM//DDR2
.init_array > L2 //
binit > L2 //引导表
.const > shared_RAM //DDR2//L2 //常量数据。 是 L2、现在是具有 FPGA 代码的 DDR2
.switch > L2 //跳转表
.text > L2// DDR2 //可执行代码
.text:_c_int00:align=1024 > L2 // Entrypoint
组(NEARDP_DATA) //组近数据
{
.neardata
rodata
.bss //注意:已删除填充= 0
} > L2
.far:fill = 0x0、load > L2 // far 全局和静态变量
.fardata > L2 //之前为 L2。 Far RW 数据
.stack > L2 //软件系统堆栈
.sysmem > L2 //动态内存分配区域
堆 > DDR2
{
。 += 0x01000000;
}
.cio > L2 // C I/O 缓冲器
vecs > L2 //中断矢量
FPGASection > EMIFAB2
DDR2Funcs > DDR2
SharedRAMFuncs > Shared_RAM
LEVEL2 > L2
FASTMEM:Fill = 0x0 > L1D
FASTPROG > L1P
GPIO_REG > GPIOMEM
}