Thread 中讨论的其他器件:SYSBIOS
工具/软件:TI-RTOS
大家好、
我已经开始使用 TI RTOS 在 TivaC123GXL 上进行开发、我遇到了问题、希望您能找到解决方案。
我创建了一个写入 i2c 从设备的任务,它工作正常。此后,我在 PF4上创建了 GPIO 中断,以便在发生中断时通知任务写入 i2c 从设备,然后我在 CCS 控制台中收到了以下消息:
正在等待 i2c 中断..
正在等待 i2c 中断..
正在等待 i2c 中断..
正在等待 i2c 中断..
发送
TI.SYSBIOS.family.ARM.m3/Hwi:第1277行:E_noIsr:ID = 85、PC = 00005a44
在 PC = 0x00005a44的后台线程中发生异常。
内核0:ThreadType_Task 中发生异常。
任务名称:{unknown-instance-name}、句柄:0x20001a10。
任务堆栈基地址:0x20000360。
任务堆栈大小:0x800。
R0 = 0x00000000 R8 = 0x00000001
R1 = 0x00006d79 R9 = 0x00000008
R2 = 0x20000ab4 R10 = 0x00000008
R3 = 0x00000001 R11 = 0x20001eb0
R4 = 0x20001d60 R12 = 0x00000000
R5=0x000000f8 SP (R13)=0x20000a70
R6 = 0x00000000 LR (R14)= 0x00005a95
R7 = 0x20000ab4 PC (R15)= 0x00005a44
PSR = 0x61000000
ICSR = 0x00423855
MMFSR = 0x00
BFSR = 0x00
UFSR = 0x0000
HFSR = 0x00000000
DFSR = 0x0000000b
MMAR = 0xe000ed34
BFAR = 0xe000ed38
AFSR = 0x00000000
正在终止执行...
当我通过按下链接到 PF4的用户按钮来实现中断时、任务正在等待中断、出现上述消息。
当我单独测试中断时、通过对任务进行注释、它可以正常工作。
因此,结论:任务本身就可以正常工作,中断本身就可以正常工作,但当我使用任务和中断时,我会收到上面的消息:
以下是我的代码:
/*
*版权所有(c) 2015、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*
/*
*==== empty_min.c ====
*
/* XDCtools 头文件*/
#include
#include
/* BIOS 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include
/*板头文件*/
#include "Board.h"
#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"
#include
#define my_task2_stack_size 2048
Task_StructmyTask2;
Task_Params myTask2Params;
char myTask2Stack[my_task2_stack_size];
INT = 0;
void DRI_vidExtractTouchInfos (void)
{
uint8_t writeBuffer[3];
I2C_Handle 句柄;
I2C_Params i2cparams;
I2C_Transaction i2c;
I2C_Params_init (&i2cparams);
i2cparams.bitrate = I2C_100kHz;
句柄= I2C_open (EK_TM4C123GXL_I2C3、&i2cparams);
if (handle == NULL){
system_abort ("I2C was not opened");
}
while (1)
{
printf("正在等待 i2c 中断..) \n");
如果(IS = 1)
{
I2C.slaveAddress = Board_TPL0401_ADDR;
I2C.ReadCount = 0;
I2C.readBuf =空;
I2C.writeBuf = writeBuffer;
/*启用 PWM 振荡器*/
writeBuffer[0]= 0x00;
writeBuffer[1]= 0x81;
I2C.writeCount = 2;
printf ("将发送\n");
if (!I2C_transfer (handle、&i2c)){
GPIO_WRITE (Board_LED1、Board_LED_ON);
system_abort (" I2C 传输错误! 在这里");
}
/*将 LED 置于 PWM 模式*/
writeBuffer[0]= 0x8C;
writeBuffer[1]= 0xAA;
writeBuffer[2]= 0xAA;
I2C.writeCount = 3;
if (!I2C_transfer (handle、&i2c)){
GPIO_WRITE (Board_LED1、Board_LED_ON);
system_abort ("错误的 I2C 传输!");
}
= 0;
}
Task_sleep (100);
}
}
void gpioButtonFxn0 (void)
{
/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_LED0);
GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_4);
IS = 1;
}
int main (空)
{
Board_initGeneral();
Board_initGPIO();
Board_initI2C();
//将时钟设置为80MHz
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlDelay (5);
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE);
GPIOIntRegister (GPIO_PORTF_BASE、gpioButtonFxn0);
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_4);
/*此任务等待触摸屏事件*/
Task_Params_init (&myTask2Params);
myTask2Params.STACKSIZE = my_task2_stack_size;
myTask2Params.stack = myTask2Stack;
myTask2Params.priority = 3;
Task_construct(&myTask2,(Task_funcPTR) DRI_vidExtractTouchInfos,&myTask2Params, NULL );
/*启动 BIOS */
BIOS_start();
返回(0);
}
这是我的内存部分配置:
存储器
{
闪存(RX):origin = 0x00000000,length = 0x00040000
SRAM (rwx):origin = 0x20000000,length = 0x00008000
}
/*内存中的段分配*/
部分
{
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
.vtable:> SRAM
}
非常感谢您的帮助
此致、