// //###########################################################################
FILE: RAM_management_cpu01.c
TITLE: RAM management Example for F2837xD.
//This example shows how to assign shared RAM for use by both the CPU02
//and CPU01 core. //使用CPU1与CPU2进行通信
//Shared RAM regions are defined in both the CPU02 and CPU01 linker files.
// In this example GS0 and GS14 are assigned to/owned by CPU02. The remaining
// shared RAM regions are owned by CPU01.
//! In this example:
//!
//! A pattern is written to c1_r_w_array and then IPC flag is sent to notify
//! CPU02 that data is ready to be read. CPU02 then reads the data from
//! c2_r_array and writes a modified pattern to c2_r_w_array. Once CPU02 acknowledges
//! the IPC flag to , CPU01 reads the data from c1_r_array and compares with expected
//! result.
//!
//! A Timed ISR is also serviced in both CPUs. The ISRs are copied into the shared
//! RAM region owned by the respective CPUs. Each ISR toggles a GPIO. Watch GPIO31
//! and GPIO34 on oscilloscope. If using the control card watch LED1 and LED2 blink
//! at different rates.
//! - c1_r_w_array[] is mapped to shared RAM GS1
//! - c1_r_array[] is mapped to shared RAM GS0
//! - c2_r_array[] is mapped to shared RAM GS1
//! - c2_r_w_array[] is mapped to shared RAM GS0
//! - cpu_timer0_isr in CPU02 is copied to shared RAM GS14 , toggles GPIO31
//! - cpu_timer0_isr in CPU01 is copied to shared RAM GS15 , toggles GPIO34
//!
//! \b Watch \b Variables
//!
//! - error Indicates that the data written is not correctly received by the other CPU.
//
//###########################################################################
// $TI Release: F2837xD Support Library v190 $
// $Release Date: Mon Feb 1 16:51:57 CST 2016 $
// $Copyright: Copyright (C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//###########################################################################;
以上文档说明指出
#include "F28x_Project.h"
#include "F2837xD_Ipc_drivers.h"
// Data exchange arrays 32*256=2^12
uint16_t c1_r_array[256];
uint16_t c1_r_w_array[256];
#pragma DATA_SECTION(c1_r_array,"SHARERAMGS0"); // 分配到GS0(CPU2)
#pragma DATA_SECTION(c1_r_w_array,"SHARERAMGS1");// 分配到GS1(CPU1)
// Global variables
uint16_t error;
uint16_t multiplier;
// External variables declared by linker.
extern uint16_t isrfuncLoadStart;
extern uint16_t isrfuncLoadEnd;
extern uint16_t isrfuncRunStart;
extern uint16_t isrfuncLoadSize;
// Prototype statements for functions found within this file.
__interrupt void cpu_timer0_isr(void);
#pragma CODE_SECTION(cpu_timer0_isr,"isrfunc") //中断程序放置到GS14
// Functions to read and write data
void Shared_Ram_dataRead_c1(void);
void Shared_Ram_dataWrite_c1(void);
void main(void)
{
//1.初始化程序
InitSysCtrl();
#ifdef _STANDALONE
#ifdef _FLASH
// Send boot command to allow the CPU02 application to begin execution
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
// Send boot command to allow the CPU02 application to begin execution
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
#endif
#endif //引导CPU2启动
// 2.初始化GPIO:
InitGpio(); // Skipped for this example
// 3.关中断
DINT;
// 初始化PIE
InitPieCtrl();
// 清除中断
IER = 0x0000;
IFR = 0x0000;
// 初始化PIE向量表
InitPieVectTable();
// GPIO31属于CPU2
GPIO_SetupPinMux(31,GPIO_MUX_CPU2,0);
GPIO_SetupPinOptions(31, GPIO_OUTPUT,0);
// GPIO34属于CPU1
GPIO_SetupPinMux(34,GPIO_MUX_CPU1,0);
GPIO_SetupPinOptions(34, GPIO_OUTPUT,0);
// 将GS0和GS14控制权给CPU2
while( !(MemCfgRegs.GSxMSEL.bit.MSEL_GS0 &
MemCfgRegs.GSxMSEL.bit.MSEL_GS14))
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS0 = 1;//0:CPU1 is master for this memory
//1:CPU2 is master for this memory
MemCfgRegs.GSxMSEL.bit.MSEL_GS14 = 1;
EDIS;
}
// 将中断函数拷贝进入GS14 RAM空间
memcpy(&isrfuncRunStart, &isrfuncLoadStart, (uint32_t)&isrfuncLoadSize);
//指定中断函数
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER0_INT = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
///初始化定时器
InitCpuTimers(); // For this example, only initialize the Cpu Timers
//设置定时器2s
ConfigCpuTimer(&CpuTimer0, 200, 2000000);
//启动定时器
CpuTimer0Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
// 开始中断
IER |= M_INT1;
// 开PIE
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // 开全局中断
ERTM; // 开启实时中断
// Main Code
error = 0;
multiplier = 0;
Shared_Ram_dataWrite_c1(); //给c1_r_w_array数组中写入数据内容为[0]:multiplier,[1]-[255]=1-255
IPCLtoRFlagSet(IPC_FLAG10); /挂起中断信号FLAG10
while(1)
{
// 如果没有挂起中断标志(代表CPU2已经操作完毕,ACK了FLAG10)
if(IPCLtoRFlagBusy(IPC_FLAG10) == 0)
{
Shared_Ram_dataRead_c1(); //读取c1_r_array中的数据
if(multiplier++ > 255)
{
multiplier = 0;
} //multipliter++,单只能在0-255中间循环
//给c1_r_w_array数组中写入数据内容为[0]:multiplier,[1]-[255]=1-255
Shared_Ram_dataWrite_c1();
IPCLtoRFlagSet(IPC_FLAG10);
}
}
}
__interrupt void cpu_timer0_isr(void)
{
EALLOW;
CpuTimer0.InterruptCount++; //记录进入中断次数
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; //GPIO34翻转
EDIS;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除中断标志
}
void Shared_Ram_dataWrite_c1(void) //写入c1_r_w_array中数据
{
uint16_t index;
// Use first location to write a multiplier.
c1_r_w_array[0] = multiplier; //0
for(index = 1; index < 256; index++)
{
c1_r_w_array[index] = index;
//the following code will attempt to write to a shared RAM
//assigned to cpu2 and as a result will cause an error.
//c1_r_array[index] = 1000 + index;
}
}
//读取CPU2处理后的数据并进行校验是否进行了乘法
void Shared_Ram_dataRead_c1(void)
{
uint16_t index;
if(c1_r_array[0] == multiplier)
{
for(index = 1; index < 256; index++)
{
if(c1_r_array[index] != multiplier*c1_r_w_array[index])
{
error = 1;
}
}
}
else
{
error = 1;
}
}
#include "F28x_Project.h"
#include "F2837xD_Ipc_drivers.h"
uint16_t c2_r_w_array[256];
uint16_t c2_r_array[256];
#pragma DATA_SECTION(c2_r_array,"SHARERAMGS1"); //分配给GS1(CPU1)
#pragma DATA_SECTION(c2_r_w_array,"SHARERAMGS0"); //分配给GS0(CPU2)
// External variables declared by linker.
extern uint16_t isrfuncLoadStart;
extern uint16_t isrfuncLoadEnd;
extern uint16_t isrfuncRunStart;
extern uint16_t isrfuncLoadSize;
// Prototype statements for functions found within this file.
__interrupt void cpu_timer0_isr(void);
#pragma CODE_SECTION(cpu_timer0_isr,"isrfunc")
void Shared_Ram_dataWrite_c2(void);// function to write data from shared RAM owned by c2
void main(void)
{
// InitSysCtrl();
// InitGpio(); // Skipped for this example
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// CPU1未分配RAM就一直等待
while(!( MemCfgRegs.GSxMSEL.bit.MSEL_GS0 &
MemCfgRegs.GSxMSEL.bit.MSEL_GS14 ) )
{
}
// 将中断拷贝进入RAM
memcpy(&isrfuncRunStart, &isrfuncLoadStart, (uint32_t)&isrfuncLoadSize);
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TIMER0_INT = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers(); // For this example, only initialize the Cpu Timers
//定时器设置为1s
ConfigCpuTimer(&CpuTimer0, 200, 1000000);
// 启动定时器
CpuTimer0Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
// Step 5. User specific code, enable interrupts:
// Enable CPU int1 which is connected to CPU-Timer 0
IER |= M_INT1;
// Enable TINT0 in the PIE: Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(1)
{
//如果CPU1挂起了中断线FLAG10
if(IPCRtoLFlagBusy(IPC_FLAG10) == 1)
{
//Read c2_r_array and modify c2_r_w_array
Shared_Ram_dataWrite_c2(); //处理CPU1传送来的信息
IPCRtoLFlagAcknowledge (IPC_FLAG10); //应答
}
}
}
// function definitions
__interrupt void cpu_timer0_isr(void) //每1s进入一次中断程序
{
EALLOW;
CpuTimer0.InterruptCount++;
GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1; //灯光闪烁一次
EDIS;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
// Read data from c2_r_array written by CPU01 and
// modify and write into c2_r_w_array
// c2_r_array[0] is used to hold the multiplier value.
void Shared_Ram_dataWrite_c2(void)
{
uint16_t index;
uint16_t multiplier;
multiplier = c2_r_array[0];
c2_r_w_array[0] = multiplier;
for(index = 1; index < 256; index ++)
{
c2_r_w_array[index] = multiplier*c2_r_array[index];
}
}
本博客仅供记录学习过程和分享学习心得使用,感谢提供源码的公司。
第一次开博客了,想记录一下学习的过程。坐标武汉小硕一名,目前在学习dsp。现在想的是做出双核程序,CPU1跑算法,CPU2通过IPC交互信息后跑通信。
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法