Thread 中讨论的其他器件:SYSBIOS、 TMP102
工具/软件:TI-RTOS
您好!
/*下面是我的示例代码*/
/* XDCtools 头文件*/ 
#include 
#include 
/* BIOS 头文件*/ 
#include 
#include 
/* TI-RTOS 头文件*/ 
#include 
#include 
/*示例/板头文件*/ 
#include "Board.h" 
#define TASKSTACKSIZE 640
Task_Structtask0Struct; 
char task0stack[TASKSTACKSIZE]; 
Task_Structtask1Struct; 
char task1stack[TASKSTACKSIZE]; 
/* 
 * ==== taskFxn ==== 
 * 此函数的任务是静态创建的。 请参阅工程的.cfg 文件。 
 * 
void i2cfunc() 
{ 
 unsigned int   i; 
    uint16_t       温度; 
    uint8_t        txBuffer[1]; 
    uint8_t        rxBuffer[2]; 
    I2C_Handle     i2c; 
    I2C_Params     i2cParams; 
    I2C_Transaction i2cTransaction; 
    /*创建 I2C 以供使用*/ 
    I2C_Params_init (&i2cParams); 
    i2cParams.bitrate = I2C_400kHz; 
    I2C = I2C_open (Board_I2C_TMP、&i2cParams); 
    if (i2c == NULL){ 
        System_abort ("初始化 I2C\n 时出错"); 
    } 
    否则{ 
        system_printf ("I2C 已初始化!\n"\}); 
    } 
    /*指向 T 环境寄存器并读取其2个字节*/ 
    TxBuffer[0]= 0x01; 
    i2cTransaction.slaveAddress = Board_TMP006_ADDR; 
    i2cTransaction.writeBuf = txBuffer; 
    i2cTransaction.writeCount = 1; 
    i2cTransaction.readBuf = rxBuffer; 
    i2cTransaction.ReadCount = 2; 
    /*采集20个样本并将其打印到控制台*/ 
    对于(i = 0;i < 20;i++){ 
        if (I2C_transfer (i2c、&i2cTransaction)){ 
            /*从接收到的数据中提取°C;请参阅 TMP102数据表*/ 
            温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2); 
            /* 
             *如果 MSB 设置为"1"、则我们有二进制补码 
             *需要符号扩展的负值 
             * 
            if (rxBuffer[0]& 0x80){ 
                温度|= 0xF000; 
            } 
           /* 
            *为简单起见、将温度值除以32即可摆脱 
            *十进制精度;请参阅 TI 的 TMP006数据表 
            * 
            温度/= 32; 
            System_printf ("样本%u:%d (C)\n"、i、温度); 
        } 
        否则{ 
            System_printf ("I2C 总线故障\n"); 
        } 
        system_flush(); 
        Task_sleep (1000); 
    } 
    /*已取消初始化 I2C */ 
    I2C_Close (i2c); 
    System_printf ("I2C 已关闭!\n"\}); 
    system_flush(); 
} 
空 taskFxn (UARg arg0、UARg arg1) 
{ 
 i2cfunc(); 
} 
/* 
 * ==== main ==== 
 * 
int main (空) 
{ 
   Task_Params taskParams; 
   Task_Params task1Params; 
   /*呼叫板初始化函数*/ 
   Board_initGeneral(); 
   Board_initGPIO(); 
   Board_initI2C(); 
   /*构造 tmp006任务线程*/ 
   Task_Params_init (&taskParams); 
   taskParams.STACKSIZE = TASKSTACKSIZE; 
   taskParams.stack =_task0Stack; 
   Task_construct(&task0Struct,(Task_FuncPtr) taskFxn、&taskParams、NULL); 
   /*打开用户 LED */ 
   GPIO_WRITE (Board_LED0、Board_LED_ON); 
   system_printf ("启动 I2C 示例\n 系统提供程序设置为 SysMin。" 
                 "停止目标以查看 ROV 中的任何 SysMin 内容。\n"); 
   /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/ 
   system_flush(); 
   /*启动 BIOS */ 
   BIOS_start(); 
   返回(0); 
} 
该程序在单个任务中工作正常、但如果我使用多个任务、I2C 传输函数将无法工作。
问题:
1.为什么(I2C_transfer (i2c、&i2cTransaction))可以很好地处理单个任务而不是处理多个任务?
2.我应该怎么做才能完成 I2C_transfer 调用的传输。
3.我增加了任务的堆栈大小和任务的优先级。 在这两种情况下、I2C 传输都没有完成。
在进行 I2C 传输之前、处理器会处理其他任务。 是这样吗? 如何解决?