Thread 中讨论的其他器件:C2000WARE、 SYSBIOS
工具/软件:TI-RTOS
您好!
我想实现一个小型 SYS/BIOS 和 C2000Ware 工程、该工程在控制台中打印 SCI 通信接收到的字符。 我想配置一个 RX SCI 中断。 同时、有2个任务只需通过控制台进行打印、每秒打印一个字符串。 为此、我已将 driverlib 集成到 SYS/BIOS 项目中。 我已经复制了 driverlib sci 回送中断示例中的大部分代码。
我的代码如下:
#include
#include
#include
#include
#include
#include "c2000ware/device.h"
#define task_scI_base SCIB_BASE
void Task1 (UARg arg1、UARg arg2);
/*计数器由计时器中断递增*/
易失性 UINT tickCount = 0;
/*
=== main ====
*/
int main()
{
Task_Params task_PRMS;
ERROR_Block EB;
/*
*将"Hello world"打印到日志缓冲区。
*
System_printf ("start\r\n");
system_flush();
ERROR_INIT (&EB);
Task_Params_init (&task_PRM);
Task_PRM.STACKSIZE = 1024;
Task_PRM.priority = 15;
Task_create (Task1、&task_prMS、&EB);
/*
*启动 BIOS。
*开始任务调度。
*
BIOS_start();/*不返回*/
return (0);
}
//
sciaRXFIFOISR - SCIA 接收 FIFO ISR
//
__interrupt void sciRXFIFOISR (void)
{
uint16_t a[10];
SCI_readCharArray (task_sci_BASE、A、1);
A[1]='\0';
System_printf ("a =%s\r\n、a);
system_flush();
SCI_clearOverflowStatus (task_SCI_base);
SCI_clearInterruptStatus (task_SCI_base、SCI_INT_RXFF);
//发出 PIE ACK
interrupt_clearACKGroup (interrupt_ack_group9);
}
void initComms (void){
//
//初始化设备时钟和外设
//
device_init();
//
//通过禁用引脚锁定和启用上拉来设置 GPIO
//
DEVICE_initGPIO();
//
// GPIO28是 SCI Rx 引脚。
//
GPIO_setMasterCore (71、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_71_SCIRXDB);
GPIO_setDirectionMode (71、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (71、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (71、GPIO_QUAL_ASYNCx);
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();
//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
interrupt_register (INT_SCIB_RX、sciRXFIFOISR);
//
// 8个字符位,1个停止位,无奇偶校验。 波特率为9600。
//
SCI_setConfig (task_SCI_base、device_LSPCLK_FREQ、115200、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule (task_sci_BASE);
SCI_resetChannels (task_sci_BASE);
SCI_enableFIFO (task_sci_BASE);
//
//启用 RX 和 TX FIFO 中断
//
SCI_enableInterrupt (task_SCI_base、SCI_INT_RXFF);
SCI_disableInterrupt (task_SCI_base、SCI_INT_RXERR);
SCI_setFIFOInterruptLevel (task_SCI_base、SCI_FIFO_TX0、SCI_FIFO_RX1);
SCI_performSoftwareReset (task_sci_BASE);
SCI_resetTxFIFO (task_sci_BASE);
SCI_resetRxFIFO (task_sci_BASE);
#ifdef 自动波特率
//
//执行自动波特率锁定。
// SCI 要求用'A'或'A'来锁定波特率。
//
SCI_lockAutobaud (task_SCI_base);
#endif
INTERRUPT_ENABLE (INT_SCIB_RX);
INTERRUPT_ENABLE (INT_SCIB_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
}
空任务2 (UARg arg1、UARg arg2){
initComms();
while (true){
System_printf ("任务2\r\n");
system_flush();
Task_sleep(1000);
}
}
空任务1 (UARg arg1、UARg arg2){
Task_Params task_PRMS;
ERROR_Block EB;
ERROR_INIT (&EB);
Task_Params_init (&task_PRM);
Task_PRM.STACKSIZE = 1024;
Task_PRM.priority = 15;
Task_create (task2、&task_prMS、&EB);
while (true){
System_printf ("任务1\r\n");
system_flush();
Task_sleep(1000);
}
}
问题是、每秒打印一个简单字符串的任务都会在指令时被占用:
Task_sleep (1000);
如果我评论下一行、它们不会卡住:
initComms();
调试时,我检查了 initComms()函数中使其他两个任务不起作用的函数是:
interrupt_initModule();
我已经检查了这个函数的代码,接下来的行负责将另外2个任务从 Task_sleep()函数中占用:
IER = 0x0000U; IFR = 0x0000U;
我想此 driverlib 代码与我的 app.cfg 有冲突、因此请在下面找到它:
VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var Memory = xdc.useModule('xdc.runtime.Memory'
) var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
var Boot = xdc.useModule('ti.catalog.c2800.initF2837x.Boot');
//
*取消注释此行以全局禁用断言。
*所有模块继承'库'模块的默认值。 您
*可以使用 Module.common$按模块覆盖这些默认值。
*禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
*/
*
取消注释此行以防止模块名称加载到目标上。
*模块名称字符串放置在.const 段中。 将此
*参数设置为 false 将节省.const 段中的空间。 错误和
*断言消息将包含"未知模块"前缀、而
不是*实际模块名称。
Defaults.common$.namedModule = false;
*/
/*
将系统中的 exit 处理程序数组最小化。 System 模块包括
*一组函数,这些函数在 System_atexit()中注册,
*由 System_exit()调用。
//
System.maxAtexitHandlers = 4;
/*
取消注释此行以禁用错误打印功能。
*禁用时,我们会丢失错误信息,因为
*不打印错误。 如果
*由于 Error_print()函数
*调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
error.raiseHook =空;
*/
/*
取消注释此行以防止*在
目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
*将此参数设置为 false 将节省.const 段中的空间。
*错误、断言和日志消息将打印原始 ID 和 args、而不是
*格式化的消息。
text.isLoaded = false;
*/
/*
取消注释此行以在
程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
*可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
SysMin.flushAtExit = false;
*/
/*
BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
//
BIOS.heapSize = 0x1000;
//
*从源代码构建自定义 SYS/BIOS 库。
//
BIOS.libType = BIOS.LibType_Custom;
//系统堆栈大小(由 ISR 和 Swi 使用)*/
Program.stack = 0x100;
// System_printf ()的循环缓冲区大小*/
sysmin.bufSize = 0x200;
//
*为整个系统创建并安装记录
器*/
var logerBufParams = 32.creLogerBufParams
;创建和安装 loggerBufParams = 32;创建 loggerBufParfLoggerfParams =新建 LoggerfParams;
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.always_on;
System.SupportProxy = SysMin;
Boot.configureClocks = true;
boot.configureFlashController = true;
BIOS.cpufreq.lo = 200000000;
Clock.tickPeriod = 1000;
Boot.SYSCLKDIVSEL = 1;
Boot.OSCCLK = 20;
boot.SPLLIMULT = 20;
boot.SPLLFAULT = Boot.Fract_0;
Boot.OSCCLKSRCSEL = Boot.OSCCLK_XTAL;
Boot.DisableWatchdog = true;
Boot.BootFromFlash = true;
boot.configSharedRAM = true;
有人能告诉我正在发生什么情况并向我提出解决方案吗?
提前感谢!
此致、
Adria