C6678开发概述
- 参考
- 开发环境
- 标记及术语
- 创建sys/bios自定义平台
- 运行第一个sys/bios程序
- Clock模块使用Demo
参考
TMS320C6678 Multicore Fixed and Floating-Point Digital Signal Processor Datasheet
TMS320C66x DSP CorePac User Guide 官方手册
创龙6678开发教程
开发环境
CCS5.5
标记及术语
☆ - 表示推荐操作
单镜像 - 每个核心运行相同的应用程序
多镜像 - 每个核心运行不同的应用程序
创建sys/bios自定义平台
Sys/bios使用时首先需要创建平台,然后基于平台创建软件工程。
a) File->New->Project…->RTSC:New RTST Platform
b) 配置平台名、路径、芯片
c) 配置存储器
运行第一个sys/bios程序
a) View->TI Resource Explorer
b) 选择Typical,并导入工程“Import the example project into CCS”
c) 配置工程,选择自定义的平台路径
d) 工程生成后可在以下位置修改工程配置
e) 用XGCONF 打开*.cfg工程配置文件(Open with > XGCONF)进行BIOS配置
f) 编译工程,首次编译报错:
>> Compilation failure
memory range L1DSRAM
"./configPkg/linker.cmd", line 28: error #10080-D: length not specified for
memory range L1PSRAM
error #10010: errors encountered during linking; "typical_TMS320C6678.out" not built
gmake: *** [typical_TMS320C6678.out] Error 1
gmake: Target `all' not remade because of errors.
解决方法,打开Debug/configPkg/linker.cmd文件,注释掉:L1DSRAM和L1PSRAM,如下:
g) 运行程序,结果如下,表明多任务成功运行
Clock模块使用Demo
来源:
View->TI Resource Explorer-> Clock Example
功能:
该模块用于定时启动某个任务/周期执行某个任务
//头文件:
include <ti/sysbios/knl/Clock.h>
//主要函数功能:
clkParams.period = 10; //设置循环执行周期,单次执行设置为:0
clkParams.startFlag = TRUE;//设置循环执行为:TRUE/单次执行为:FALSE
clk2 = Clock_create(clk1Fxn, 1000, &clkParams, NULL);
//关键参数(定时启动的函数名称,任务启动起始时刻应>0,配置参数)
Clock_start(clk2);//启动时钟2
time = Clock_getTicks();//获取当前时刻值
官方Demo展示了2个任务:
a) clk0Fxn循环执行周期为5,启动时刻为5;
b) clk1Fxn单次执行,启动时刻为11,该任务调用BIOS_exit(0)结束sys/bios。
注意:
a) 经测试发现System_printf函数无法实时输出结果到环境,打印到下图位置,在sys/bios结束后才会将部分最近缓存打印出来,因此调试后续仍要用串口打印。
b) Clock_create函数中的任务启动起始时刻应>0,否则该任务无法运行
c) 创建多个任务时,需要把单次执行的任务放在最后,且写法如下,只将最后一个Clock_create返回值进行赋值
Clock_create(clk0Fxn, 5, &clkParams, NULL);
Clk2 = Clock_create(clk0Fxn1, 100, &clkParams, NULL);
Clock_start(clk2);
完成程序:
/*
* ======== main.c ========
*/
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Clock.h>
unsigned int task_run_counnect = 0;
/*
* ======== taskFxn ========
*/
Void taskFxn(UArg arg0)
{
System_printf("enter taskFxn()\n");
//Task_sleep(10);
System_printf("exit taskFxn()\n");
BIOS_exit(0);
}
Void taskFxn1(UArg arg0)
{
task_run_counnect++;
//Task_sleep(10);
System_printf("task taskFxn1 run counnect is %d\n",task_run_counnect);
}
Void taskFxn2(UArg arg0)
{
task_run_counnect++;
//Task_sleep(10);
System_printf("task taskFxn2 run counnect is %d\n",task_run_counnect);
}
Void taskFxn3(UArg arg0)
{
task_run_counnect++;
//Task_sleep(10);
System_printf("task taskFxn3 run counnect is %d\n",task_run_counnect);
}
/*
* ======== main ========
*/
Int main()
{
Task_Handle task;
Error_Block eb;
System_printf("enter main()\n");
/*
Error_init(&eb);
task = Task_create(taskFxn, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}
*/
Clock_Handle clk2;
Clock_Params clkParams;
/* Create a periodic Clock Instance with period = 5 system time units */
Clock_Params_init(&clkParams);
clkParams.period = 30;
clkParams.startFlag = TRUE;
Clock_create(taskFxn1, 1, &clkParams, NULL);
clkParams.period = 30;
clkParams.startFlag = TRUE;
Clock_create(taskFxn2, 10, &clkParams, NULL);
clkParams.period = 30;
clkParams.startFlag = TRUE;
Clock_create(taskFxn3, 20, &clkParams, NULL);
clkParams.period = 0;
clkParams.startFlag = FALSE;
clk2 = Clock_create(taskFxn, 100, &clkParams, NULL);
Clock_start(clk2);
BIOS_start(); /* does not return */
return(0);
}