打印

学习TMS320C6678

[复制链接]
8351|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 枢机主教 于 2017-6-19 00:24 编辑

因为自己的水平很低,一开始是比较害怕开贴来做记录的,总觉得有点尴尬。
我现在是一个人在研究TMS320C6678,周围没有其他人在做,我的进度也很慢。希望能够和论坛里也在研究TMS320C6678的朋友一起讨论交流,不管是软件设计方面还是硬件设计方面,所以还是决定开一贴,有什么问题希望大家指正。
之前下定决心发这个帖子的,不过那天正好论坛在维护,无法发主题帖,然后就一直往后拖,拖到了今天的深夜。
后面还要找工作和做毕设,没有什么项目经验,6678之前一直是看数据手册,板子拿到手一个多月吧,学得还不是很深入呢。找工作还不知道会碰到啥情况呢,想起来也是头疼。所以帖子更新肯定是没什么规律了。


感觉自己还是在入门,只是记录一些调试的内容,有些我觉得重要的就做一下解析,其中有些内容只是记录自己的理解,可能有错误,如果各位有发现,请指出错误,谢谢。

因为使用了创龙的开发板,下面可能会有几次提到,但是这个不是广告,板子是我自己劳动,出自己的钱买的,不过能弄到6678的板子,这里要感谢创龙的李工。

后面为了说明,会贴出代码,不过不会帖创龙提供的例程的。虽然产品上没有“All Rights Reserved. Unauthorized Duplication & Rent is Prohibited”这样的话,但是未经允许帖别人的劳动成果总是不太好的感觉。


对了,一楼先贴一个入门的资料的链接地址,这个还是挺有用的一个入门资料:http://www.deyisupport.com/quest ... re/f/53/t/4899.aspx


2017/06/18:现在还是在调试各个模块

相关帖子

沙发
枢机主教|  楼主 | 2017-6-18 23:42 | 只看该作者
硬件环境:
开发板:创龙的TMS320C6678的开发板,该开发板使用核心板加底板的模式,底板标注上的标注型号为:TL6678-EasyEVM-A3TL代表创龙,6678代表TI的多核DSP芯片TMS320C6678A3是版本号,不知道为什么是A3,而不是V3。核心板是默认型号:SOM-TL6678-1000-1GN8GD-I-A3SOM表示是核心板,1000表示CPU主频为1000GHz1GN表示1Gbit容量的NAND FLASH8GD表示8GbitDDR3I表示工业级温度范围。
仿真器:TL-XDS200


软件环境:
CCS v5.5.0.00077
bios_mcsdk_02_01_02_06

使用特权

评论回复
板凳
枢机主教|  楼主 | 2017-6-18 23:47 | 只看该作者
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个文件夹里的关于TMS320C6678CSL
GPIO LED
裸机开发最初的部分当然就是GPIO控制LED小灯了,用于熟悉软件开发的操作。
目标:底板上的LED小灯闪烁
原理:控制LED小灯的是DSPGPIO04,在GPIO04上周期输出高电平和低电平就可以控制LED灯闪烁了。
代码如下:
/*
* main.c
*/
#include "board.h"
#include "c6x.h"
#include "ti/csl/cslr_gpio.h"
#include "ti/csl/csl_gpio.h"
#include "ti/csl/csl_gpioAux.h"

void delay(unsigned int count);

int main(void) {
        CSL_GpioHandle        hnd;
        hnd = CSL_GPIO_open(0);        //获取GPIO模块寄存器基地址
        CSL_GPIO_setPinDirOutput(hnd, 4);        //将GPIO04设置为输出
       
        CSR = 0xffffffff;
        for( ; ; )
        {

                /*熄灭LED*/
                CSL_GPIO_setOutputData(hnd, 4);        //GPIO04输出高电平
                /*延时*/
                delay(0x00ffffff);
                /*点亮LED*/
                CSL_GPIO_clearOutputData(hnd, 4);//GPIO04输出低电平
                /*延时*/
                delay(0x00ffffff);

        }

/*        return 0;*/
}

/* 延时函数 */
void delay(volatile unsigned int count)
{
        unsigned int i;
        for(i= count; i>0; i--);
}




说明:
CSL_GpioHandle CSL_GPIO_open (Int32 instNum)
该函数用于返回GPIO模块的寄存器的基地址0x02320000,后面需要用到这个基地址来对寄存器进行操作,其返回值类型CSL_GpioHandle是一个指针,指向一个结构体,该结构体中按顺序列出了GPIO模块的寄存器,所以执行该函数后,hnd就指向了GPIO模块寄存器的基地址,通过hnd可以访问GPIO模块的寄存器。

void CSL_GPIO_setPinDirOutput (CSL_GpioHandle  hGpio, Uint8 pinNum)
该函数操作的是相对于基地址偏移0x10DIR寄存器,从而使pinNum表示的GPIO引脚为输出引脚。这里使GPIO04为输出引脚。

void CSL_GPIO_setOutputData(CSL_GpioHandle  hGpio, Uint8 pinNum)
该函数操作的是相对于基地址偏移0x18SET_DATA寄存器,从而使pinNum引脚上输出高电平。这里使GPIO04输出高电平。

void CSL_GPIO_clearOutputData(CSL_GpioHandle  hGpio, Uint8 pinNum)
该函数操作的是相对于基地址偏移0x1cCLR_DATA寄存器,从而使pinNum引脚上输出低电平。这里使GPIO04输出低电平。

Ps.创龙提供的例程中使用了核心板上的两个LED灯,而因为核心板不提供原理图,创龙提供的这个源码我也没看,所以不知道怎么控制核心板上的LED,这里就是熟悉一下CCS的操作,GPIO模块怎么操作。


疑问:为什么GPIO模块提供了OUT_DATA寄存器可以控制GPIO的输出,还提供了SET_DATACLR_DATA寄存器来控制GPIO的输出呢?这个我没整明白。

使用特权

评论回复
评论
wuwangxinan111 2019-8-14 10:01 回复TA
因为out_data是设置GPIO口为输出状态,SET_DATA是给GPIO数据寄存器写1,此时接口为高电平,CLR_DATA是给数据寄存器写0,为低电平。 
地板
枢机主教|  楼主 | 2017-6-19 00:20 | 只看该作者
本帖最后由 枢机主教 于 2017-6-21 00:22 编辑

第二个是GPIO和按键,以前学单片机和arm的时候动用过查询的方法做过。这里不使用查询的方法,而是使用中断的方法。所以这里重点是调试了中断。


单片机只用过C语言写过,不理解什么原理。arm的中断倒是听明白的,裸机的时候在0地址上放上中断向量表,其实是一条跳转指令,是用汇编语言写的,有韦东山的教程,学起来也是很快的。到DSP上的时候,一开始直接迷茫了,看师兄以前做过的项目的CCS工程中有一个“vectors.asm”的汇编文件,论坛里搜索怎么做DSP的中断调试时候,也有一个帖子https://bbs.21ic.com/icview-331273-1-1.html,也是汇编语言,但是之前根本没有看过汇编语言,也看不懂原理是什么,不知道原理真的不是我的习惯。
看“vectors.asm”这个文件开头的注释,好像是TI官方提供的,我在pdk里搜索却也没有搜索到。所以就耐心去看文档了。看了CIC的文档,看了CorePac的文档,看了CPU&Instruction set的文档,通过pdk里面提供的关于CIC的例子,弄明白了6678的中断系统。然后我发现在TI现在提供的源码的情况下,是不需要编辑修改汇编文件的,关于中断的汇编文件已经被编译到库文件里了,甚至中断处理函数都不用加“Interrupt”这个关键字来声明,不过为了弄懂中断系统,还是有必要看汇编文件的,这个在下面解析。


下面要帖的代码没有涉及到CIC,只有CorePac INTC。


目标:使用按键通过中断控制LED,按一下灯亮,按一下灯灭

原理:通过LED的按下在GPIO0上产生下降沿,从而产生GPINTn中断事件,这里的n就是0了,所以是CorePac0处理这个中断。

先贴代码:
/*
* main.c
*/
#include "stdio.h"
#include "global.h"
#include "ti/csl/cslr_gpio.h"
#include "ti/csl/csl_gpio.h"
#include "ti/csl/csl_gpioAux.h"
#include "ti/csl/src/intc/csl_intc.h"
#include "ti/csl/src/intc/cslr_intc.h"
#include "ti/csl/src/intc/csl_intcAux.h"

//定义指向CorePac的INTC的寄存器组结构体的指针
CSL_IntcRegsOvly gIntcRegisters = (CSL_IntcRegsOvly)CSL_CGEM0_5_REG_BASE_ADDRESS_REGS;

//定义用于在中断处理函数中取反操作的全局变量
unsigned char flag = 0;

//定义中断处理函数
static void GPINT0_event_handler(void *arg)
{
        CSL_GPIO_clearInterruptStatus((CSL_GpioHandle)0x02320000, 0);        //清除GPIO中断状态
        CSL_intcEventClear((CSL_IntcEventId)90);                //清除事件的状态标志位
        flag = !flag;
}

//定义GPIO0引脚的中断初始化函数
void GPIO_0_int_init(void)
{
        CSL_GpioHandle        hnd;

        printf("Debug: GPIO0 interrupt configuration...\n");

        hnd = CSL_GPIO_open(0);        //获取GPIO模块寄存器基地址
        CSL_GPIO_setPinDirInput(hnd, 0);        //将GPIO0设置为输入
        CSL_GPIO_bankInterruptEnable (hnd, 0);        //使能GPIO中断,实际是操作BINTEN寄存器
        CSL_GPIO_setFallingEdgeDetect (hnd, 0);        //GPIO0在下降沿产生中断事件GPINT0
        printf("Debug: GPIO0 interrupt configuration completed\n");
}

void GPIO_4_LED_init(void)
{
        CSL_GpioHandle        hnd;
        printf("Debug: GPIO4 LED init...\n");
        hnd = CSL_GPIO_open(0);        //获取GPIO模块寄存器基地址
        CSL_GPIO_setPinDirOutput(hnd, 4);        //将GPIO4设置为输出
        printf("Debug: GPIO4 LED init completed\n");
}

void GPIO_4_LED_control(char state)
{
        CSL_GpioHandle        hnd;

        hnd = CSL_GPIO_open(0);        //获取GPIO模块寄存器基地址
        if(state)
        {
                printf("Debug: LED01 ON...\n");
                CSL_GPIO_clearOutputData(hnd, 4);
        }
        else
        {
                printf("Debug: LED01 OFF...\n");
                CSL_GPIO_setOutputData(hnd, 4);
        }

}

void Core_intc_init(CSL_IntcParam vect_id, CSL_IntcEventId event_id, void (Int_Ser_routine)(void *arg))
{
        CSL_IntcContext                                intcContext; //先对其初始化,然后其地址用作CSL_intcInit的参数
        CSL_IntcEventHandlerRecord  EventHandler[30];//给intcContex赋值,然后在CSL_intcInit函数中使用intContex对全局变量进行赋值。这里为什么是30?
        CSL_IntcGlobalEnableState   state;        //用于保存被操作前的GIE的状态
        CSL_IntcParam               vectId;        //用来保存使用的核心的中断号
        CSL_IntcHandle              hTest;        //用来指向被赋值处理过的intcObj这个变量
        CSL_IntcObj                 intcObj;//这个结构体用于记录对应的中断ID和事件ID。
        CSL_IntcEventHandlerRecord        EventRecord;        //记录一个事件处理函数的函数指针和函数参数

        printf("Debug: CorePac interrupt configuration...\n");

        /* INTC module initialization */ /*那几个全局变量的初始化,ISTP寄存器赋值,给记录各中断的中断处理函数的结构体变量赋值*/
        intcContext.eventhandlerRecord        =        EventHandler;
        intcContext.numEvtEntries                =        30;
        if(CSL_intcInit(&intcContext) != CSL_SOK)
        {
                printf("Error: CorePac interrupt initialization failed\n");
                return;
        }

        /* Enable NMIs */  /*set NMIE = 1*/
        if(CSL_intcGlobalNmiEnable() != CSL_SOK)
        {
                printf("Error: CorePac interrupt global NMI enable failed\n");
                return;
        }

        /* Enable global interrupts */ /*set GIE = 1*/
        if(CSL_intcGlobalEnable(&state) != CSL_SOK)
        {
                printf("Error: CorePac interrupt global enable failed\n");
                return;
        }

        /* 打开INTC模块 中断ID为vect_id 事件ID为event_id */ /* 对intcObj进行赋值,把事件号路由到中断号上 */
        vectId = vect_id;
        hTest = CSL_intcOpen(&intcObj, event_id, &vectId, NULL);
        if(hTest == NULL)
        {
                printf("Error: CorePac interrupt Open failed\n");
                return;
        }

        /* 注册一个回调函数,在中断发生时被调用 */
        EventRecord.handler = Int_Ser_routine;
        EventRecord.arg = 0;
        if(CSL_intcPlugEventHandler(hTest, &EventRecord) != CSL_SOK)
        {
                printf("Error: CorePac interrupt plug vent handler failed\n");
                return;
        }

        /* Enabling the events */
        if(CSL_intcHwControl(hTest, CSL_INTC_CMD_EVTENABLE, NULL) != CSL_SOK)
        {
                printf("Error: CorePac interrupt CSL_INTC_CMD_EVTENABLE command failed\n");
                return;
        }

        printf("Debug: CorePac interrupt configuration completed\n");
}

int main(void) {
        char local_flag = 0;

        /* 配置GPIO0的中断 */
        GPIO_0_int_init();

        
        /* 配置CorePac INTC */
        Core_intc_init(CSL_INTC_VECTID_4, (CSL_IntcEventId)90, GPINT0_event_handler);

        /* 配置GPIO4控制LED */
        GPIO_4_LED_init();
        GPIO_4_LED_control(LED_OFF);

        for( ; ; )
        {
                if(local_flag != flag){
                        if(1 == flag)
                                GPIO_4_LED_control(LED_ON);
                        else
                                GPIO_4_LED_control(LED_OFF);

                        local_flag = flag;
                }
        }

}



这个解析明天在说吧,要明白这里代码的原理,需要明白delayslot,pipeline,汇编等相关内容,解析起来肯定会比较麻烦。当时csl提供的关于中断这一块的源码我看了大概有一个多星期才看完。



20170620
TMS320C66x DSP CPU and intruction set这个文档里对delay slot的解释如下:
The number of delay slots is equivalent to the number of additional cycles required after the source operands are read from the result to be available for reading
也就是说一条指令读了源操作数之后在结果可以被读取之前需要经过的周期数,从这里可以知道,有点指令并不是一个周期就可以执行完的,需要多个周期才能执行完。在流水线中,指令执行的各个周期被编号为E1、E2、E3……

TMS320C66x DSP CPU and intruction set这个文档里对functional  unit latency的解释如下:
the functional unit latency is equivalent to the number of cycles that must pass before the functional unit can start excuting the next instruction.
也就是功能单元能够执行下一条指令之前必须要经过的周期数。

为了能够使程序高速执行,CPU采用了流水线结构,取指令、解码指令和执行指令同时进行,在C66x中,这三个阶段又被细分,取指令阶段被细分为PG、PS、PW、PR,解码又被细分为DP、DC,执行部分被分为E1、E2、E3……被细分的每一部分对应一个周期。

TMS320C66x DSP CPU and intruction set这个手册中有一个图片说明了流水线的操作:

上图是每个取指包就是一个执行包的情况。从上图可以看出,一个执行包执行了E1之后开始进入E2阶段,此时下一个执行包也开始进入到E1执行。

知道了上面的这些内容后就可以理解MCSDK安装完后生成的文件夹pdk_C6678_1_1_2_6\packages\ti\csl\src\intc里面的代码了。这里的代码和中断相关,其中最重要的中断服务表就是在这里产生的。理解中断,先来看中断服务表的产生。
首先是_csl_intcIsrDispatch.asm这个文件,里面是汇编代码,用于产生DSP的中断服务表,这个文件的代码如下:
;/*****************************************************************************
; *  Copyright (c) Texas Instruments Inc 2002, 2003, 2004, 2005, 2008   
; *  
; *  Use of this software is controlled by the terms and conditions found in the
; *  license agreement under which this software has been supplied.            
; *****************************************************************************/

;/** [url=home.php?mod=space&uid=288409]@file[/url] _csl_intcIsrDispatch.asm
; *
; *  [url=home.php?mod=space&uid=212281]@date[/url] 12th June, 2004
; *  [url=home.php?mod=space&uid=187600]@author[/url] Ruchika Kharwar
; */
    .global __CSL_intcDispatcher
    .def __CSL_intcVectorTable
    .ref __CSL_intcCpuIntrTable
   
RESV    .macro num
    .loop num
    mvkh __CSL_intcCpuIntrTable,a4
    .endloop
    .endm
_CSL_intcpush .macro reg
    stw reg,*b15--[1]
    .endm
_CSL_intcpop .macro reg
    ldw *++b15[1],reg
    .endm
CALLDISP .macro intr
    _CSL_intcpush a0
    mvkl __CSL_intcCpuIntrTable, a0
    mvkh __CSL_intcCpuIntrTable, a0
    ldw *++a0[intr + 1], a0
    nop 2
    stw a0, *-a0[intr + 1]  
    _CSL_intcpop a0
    bnop a0, 5  
    .endm   
    .sect ".csl_vect"
    .align 1024         
__CSL_intcVectorTable:   
__CSL_intcRsv0:
    RESV 8

__CSL_intcIsrNMI:   
    CALLDISP 1
     
__CSL_intcRsv2:
    RESV 8
   
__CSL_intcRsv3:
    RESV 8
   
__CSL_intcIsr4:
    CALLDISP 4

__CSL_intcIsr5:
    CALLDISP 5

__CSL_intcIsr6:
    CALLDISP 6

__CSL_intcIsr7:
    CALLDISP 7

__CSL_intcIsr8:
    CALLDISP 8

__CSL_intcIsr9:
    CALLDISP 9

__CSL_intcIsr10:
    CALLDISP 10

__CSL_intcIsr11:
    CALLDISP 11

__CSL_intcIsr12:
    CALLDISP 12

__CSL_intcIsr13:
    CALLDISP 13

__CSL_intcIsr14:
    CALLDISP 14

__CSL_intcIsr15:
    CALLDISP 15

下面分段解析:
.global __CSL_intcDispatcher

声明一个全局变量 __CSL_intcDispatcher,不过这个变量好像没什么用。


.def __CSL_intcVectorTable

这个表示__CSL_intcVectorTable这个量在这个文件中定义,会在其他文件中使用,实际是在_csl_intcIntrEnDisRes.asm中被用于赋值给istp寄存器,也就是记录了IST的基地址。

.ref __CSL_intcCpuIntrTable

这个表示__CSL_intcCpuIntrTable在其他文件中定义,在这里会被使用到。其实是在_csl_intc.h定义了_CSL_intcCpuIntrTable这样一个结构体变量,在汇编中前面多加一条下划线。

RESV .macro num
.loop num
mvkh __CSL_intcCpuIntrTable,a4
.endloop
.endm
这个是一个汇编的宏定义,宏名叫RESV,宏有一个参数为num。宏的定义在.macro和.endm之间。
下面.loop和.endloop表示这两者之间的代码重复循环执行,循环执行的次数就是.loop之后的那个数字。
中间的一条就是实际的汇编指令了,就是把C语言头文件中定义的变量_CSL_intcCpuIntrTable的地址的高半字节写到a4寄存器中。这里说是地址,其实也是我的猜测,因为只有是地址的情况下,一切才解释的通,如果哪位发现有问题,请告知。


按照上面的解释,下面又是3个宏,分别是_CSL_intcpush,_CSL_intcpop,CALLDISP。
_CSL_intcpush里只有一条保存指令,作用是将这个宏的参数reg所代表的寄存器存储到b15寄存器中的值作为地址指向的内存中,把b15自身的值减4。b15应该是编译器约定使用的栈指针,这里应该是入站操作。
_CSL_intcpop里也只有一条装载指令,作用是先执行b15=b15+4,然后新的b15中的值作为地址指向的内存中的值赋给reg,这里应该是出栈操作。

CALLDISP这个宏就可有意思了,因为它和上面说到的delay slot,流水线等相关。这个宏里有8条指令,正好一个取值包,而C66x DSP的中断服务表IST中每一个表项的大小也是一个取指包的大小。CSLLDISP这个宏里的8条汇编指令是完全串行执行的,也就是说这个取指包在解码阶段会被分为8个执行包。这个宏有一个参数intr
第一条 _CSL_intcpush a0是把a0的值如栈,需要3个周期完成。
第二条和第三条的作用是把_CSL_intcCpuIntrTable这个在C语言头文件中定义的结构体变量的地址保存到a0寄存器中。这两条指令都是一个周期完成的。
第四条的作用是把a0寄存器的值加上((intr+1)×4),这个操作的结果是在下一条指令就可以获得的,指向的内存处的值又赋给a0寄存器,需要注意的是,这条指令不是一个周期就能执行完的,而是需要5个指令周期才能执行完,所以a0里面的值被更新为内存中的值时已经是5个指令周期后了,但是在这中间,下面的指令还是在执行的。
第五条是两个空操作,消耗掉两个周期。
第六条是把a0寄存器的值存储到a0寄存器中的值减去((intr+1)×4)指向的内存中去。注意,这时第四条指令还没执行完了,所以实际情况应该是给_CSL_intcCpuIntrTable.currentVectId赋值为中断函数名成员的地址
第七条,恢复寄存器a0的值,需要5个周期来完成。
第八条,跳转到a0寄存器所指向的地址处执行,同时为了解决branch delay slot的问题,还有5个无操作。这里就是跳转到了_CSL_intcCpuIntrTable这个结构体变量中的和intr这个参数相关的函数指针上了。


这里要注意a0寄存器的值的更新,并不是上面一条指令完全执行完才执行下一条指令的,所以a0寄存器的值的更新是一个值得细致分析的地方。













使用特权

评论回复
5
zhangmangui| | 2017-7-1 21:54 | 只看该作者
还望楼主继续分享   

使用特权

评论回复
6
1988020566| | 2017-7-2 20:48 | 只看该作者
枢机主教 发表于 2017-6-18 23:47
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个 ...

没有配套的相关视频资料吗?

使用特权

评论回复
7
1988020566| | 2017-7-2 20:48 | 只看该作者
枢机主教 发表于 2017-6-18 23:47
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个 ...

以前只见过TI的6678 评估板。

使用特权

评论回复
8
zhangmangui| | 2017-7-2 22:14 | 只看该作者
1988020566 发表于 2017-7-2 20:48
以前只见过TI的6678 评估板。

推得比较火的是创龙的产品

使用特权

评论回复
9
helongdm| | 2017-7-5 14:29 | 只看该作者
创龙的光盘能共享下吗?谢谢

使用特权

评论回复
10
HM_Wei| | 2017-7-26 22:20 | 只看该作者
创龙做得感觉确实不错~~

使用特权

评论回复
11
zhangmangui| | 2017-7-27 20:40 | 只看该作者
HM_Wei 发表于 2017-7-26 22:20
创龙做得感觉确实不错~~

真的很不错吗。没怎么关注

使用特权

评论回复
12
jkkhll| | 2018-2-14 15:49 | 只看该作者

使用特权

评论回复
13
aspoke| | 2018-2-22 22:18 | 只看该作者
枢机主教 发表于 2017-6-18 23:47
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个 ...

怎么单个核操作恩

使用特权

评论回复
14
232321122| | 2018-2-22 22:19 | 只看该作者
C6000的高端产品。

使用特权

评论回复
15
ghuca| | 2018-2-22 22:19 | 只看该作者
这个看着确实很给力。

使用特权

评论回复
16
soodesyt| | 2018-2-22 22:20 | 只看该作者
枢机主教 发表于 2017-6-18 23:47
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个 ...

怎么确定在哪个核运行的?

使用特权

评论回复
17
mnynt121| | 2018-2-22 22:20 | 只看该作者
枢机主教 发表于 2017-6-19 00:20
第二个是GPIO和按键,以前学单片机和arm的时候动用过查询的方法做过。这里不使用查询的方法,而是使用中断 ...

硬件电路贵吗?

使用特权

评论回复
18
aspoke| | 2018-2-22 22:23 | 只看该作者
枢机主教 发表于 2017-6-18 23:47
首先是裸机开发部分,并且和多核无关。我使用了bios_mcsdk_02_01_02_06安装后生成的pdk_C6678_1_1_2_6这个 ...

数据共享怎么实现的

使用特权

评论回复
19
232321122| | 2018-2-22 22:23 | 只看该作者
8核做处理是不是有点温度太高了

使用特权

评论回复
20
mnynt121| | 2018-2-22 22:23 | 只看该作者
枢机主教 发表于 2017-6-19 00:20
第二个是GPIO和按键,以前学单片机和arm的时候动用过查询的方法做过。这里不使用查询的方法,而是使用中断 ...

看到一个FPGA+DSP的实现方案,用的就是6678的处理器。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:I'm so lost in you, so what do I do?

5

主题

55

帖子

4

粉丝