This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C123GH6PM:任务阻断和终止其它任务

Guru**** 2604225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/746679/rtos-tm4c123gh6pm-task-blocking-and-terminating-other-tasks

器件型号:TM4C123GH6PM

工具/软件:TI-RTOS

大家好、

我不熟悉 TI-RTOS。  

我将为项目使用以下配置

CCSv8.1.0、TI-RTOS-2.16.00.08、Tiva Ware:2.1.4.178;XDC:3.32.00.06Laptop OS:Windows 10


我的系统中有4个任务。 执行其中一项任务。 我希望在按下按钮时获取 IMU 传感器数据。 为了实现这一点、我配置为在按下按钮时发布信标

代码片段如下所示:

//
向上按钮上 GPIO 中断的回调函数。*/ void gpioButtonFxn1 (无符号 int 索引)
{
semaphore_post (IMUSem);

} 

任务执行如下:

void get_IMU ()
{
// GPIO_toggle (Board_LED_blue);

I2C_Handle i2c;
I2C_Params i2cParams;
uint8_t pwr;
pwr = 0x00;

//创建 I2C 以供使用
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
i2c = I2C_open (IMU_sensor、&i2cParams);
if (i2c =









2c){System_abort (" Error Initializing I2C_n");否则}{System_open (IMU_sensor、&i2cParams);if (0x2c = 0x2C 初始化0x60b)、0x60f (0x60b)! //此行使该任务进入被阻止状态,并执行其他任务以终止状态
SIGNAL。readRegister (i2c、0x6B、&pwr、1);
执行{
SIGNAL。readRegister (i2c、 0x6B、&pwr、1);
}while (pwr & 0x40!= 0x40);

//将 PLL 与 X 轴陀螺仪参考
信号配合使用。writeRegister (i2c、0x6B、0x01);
//启用 I2C 主模式
信号.writeRegister (i2c、0x6A、0x20);
//设置采样率分频
器信号。0x2c、0x13


、iLED、0x13、writeRegister (i2c、0x13、0x13);iwriteRegister Board_LED_OFF);

while (1)
{
Semaphore_pend (IMUSem、BIOS_wait_forever);
while (GPIOPinRead (GPIO_PORTB_BASE、GPIO_PIN_2)= GPIO_PIN_2);
signal.readRegister (i2c、0x3B、(uint8_t *)&signal.imu.mpu6050、14);
}

//Deinitialized I2C
I2C_Close (i2c);
System_printf ("I2C closed!\n");
System_flush ();
} 

我的 WriteRegister()如下所示:
void writeRegister (I2C_Handle handle、uint16_t regAddr、uint16_t value)
{
uint8_t txBuffer[4];
I2C_Transaction i2c 交易;

i2cTransaction.slaveAddress = MPU6050_I2C_address;

//写入16位状态寄存器
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 2;
i2cTransaction.ReadCount = 0;

txBuffer[0]= regAddr & 0xFF;//LB Addr
TxBuffer[1]=值和0xFF;

if (!I2C_transfer (handle、&i2cTransaction)){
GPIO_WRITE (Board_LED_RED、Board_LED_ON);
system_abort (" I2C 传输错误!");
}
} 

和 readRegister()如下所示:

空 readRegister (I2C_Handle handle、
uint16_t regAddr、
uint8_t *数据、
size_t length)
{
uint8_t txBuffer[2];
I2C_Transaction i2c 交易;

i2cTransaction.slaveAddress = MPU6050_I2C_address;

//写入16位状态寄存器
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.readBuf =数据;
i2cTransaction.writeCount = 1;
i2cTransaction.ReadCount =长度;

txBuffer[0]= regAddr & 0xFF;//LB Addr

if (!I2C_transfer (handle、&i2cTransaction)){
GPIO_WRITE (Board_LED_RED、Board_LED_ON);
system_abort (" I2C 传输错误!");
}
} 

针对 IMU 任务和信号量的.cfg 文件配置如下:

VAR task3Params = new Task.Params ();
task3Params.instance.name ="IMU";
task3Params.priority = 2;
Program.global.IMU = Task.create ("&get_IMU"、task3Params);
var semaphore0Params = new semaphore.Params ();
semaphore0Params.instance.name ="IMUSem";
Program.global.IMUSem = semaphore.create (空、Semaphore0Params); 

下面是 ROV 的屏幕截图:

当在 main()中使用调试器时:



在 get_IMU()任务中的行之后

signal.writeRegister (i2c、0x6B、0x80); 

在此过程中、有人帮我解决了。

提前感谢。

此致、

Yashwanth Gandeti。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    那么问题是什么? 获取中断并执行 Semaphore_post 后、get_IMU 会发生什么情况? 它是否未运行 signal.readRegister?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Charles、

    如果我的理解不是错误的。  

    在这里,对于我的项目,我将使用静态配置方式。调用 BIOS_Init()时,所有任务都已准备好运行。 那么,在调用 main()之前,任务准备运行了吗?

    2.

    void taskxn(){/*prologue*/....
    
    
    
    …
    …
    while (1){
    Semaphore_pend ();
    ...
    (笑声)
    (笑声)
    
    。}
    /*Epilogue*/
    } 

    在上面的伪代码 中、序言本来是在等待信号量之前运行的。 将上述代码与我的代码进行比较、当我处于代码的"逻辑"部分而不是代码的 while (1)部分时、我将进入被阻止状态。 在发布之前、信标 Get_IMU 任务将进入被阻止状态、而剩余任务将进入已终止状态。

    在调试时,我知道  writeRegister()中的 I2C_transfer (handle,&i2cTransaction)正在造成这个问题。 能不能为我提供帮助。

    此致、

    Yashwanth Kumar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我在新创建的项目中实现了上述代码、它运行顺畅。 但我不知道我犯了什么错误。
    此致、
    Yashwanth。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Yashwanth Gandesti]]在上面的伪代码 序言中,该序言本应在等待信标之前运行。 将上述代码与我的代码进行比较、当我处于代码的"逻辑"部分而不是代码的 while (1)部分时、我将进入被阻止状态。 在发布信标 之前、Get_IMU 任务将进入被阻止状态、剩余任务将进入已终止状态。

    您对信标的理解是正确的。 一旦 Semaphore_pend 函数被执行、它将不会进一步执行任何代码、直到发出 semaphore_post。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Yashwanth Gandeti ]I 在新创建的项目中实现了上述代码,该项目运行顺畅。 但我不知道我在哪里犯错。[/引述]

    很高兴您的问题得到了解决。 除了创建新项目之外、您还做了哪些其他工作? 除非您可以在这个新创建的项目中再次重现问题、否则我不会发现您对使用信标的理解有问题。 我现在要关闭这个线程。 如果您有新问题或再次看到问题、您可以创建新主题。