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/DK-TM4C129X:TI-RTOS 多线程

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693651/rtos-dk-tm4c129x-ti-rtos-multithreading

器件型号:DK-TM4C129X

工具/软件:TI-RTOS

嗨、大家好、我不熟悉 CCS、也不使用 TI-RTOS。 我想在多线程中同步代码、因为我在 main 中调用两个函数。一个是使用 ADC、另一个是使用 RTOS 的 USB 鼠标主机示例、但我无法理解如何在这里使用、我可能会发布我的当前代码 谢谢。  

/*
*==== spilopopback.c =====
*
/* XDCtools 头文件*/
#include
#include
#include
#include
/* BIOS 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include
#include
/*示例/板头文件*/
#include "Board.h"


/* Tiva RC 接头*/
#include
#include
#include
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "C:\ti\TivaWare_C_Series-2.1.3.156\driverlib\adc.h"
#include "inc/hw_ints.h"
#include "C:\ti\TivaWare_C_Series-2.1.3.156\driverlib\sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/SysTick .h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"

#define SPI_MSG_LENGTH 4 //一个寄存器中一个字节的长度
#define TASKSTACKSIZE 768//size of one task

/*在存储器的.dma 段中为协处理设备分配缓冲区*/
#ifdef Mware
#pragma DATA_SECTION (masterRxBuffer、".dma");
#pragma DATA_SECTION (masterTxBuffer、".dma");
#pragma DATA_SECTION (slaveRxBuffer、".dma");
#pragma DATA_SECTION (slaveTxBuffer、".dma");
#endif

Task_Structuretask0Struct;//任务结构
char task0stack[TASKSTACKSIZE];

char masterRxBuffer[SPI_MSG_length];//将保存接收到的数据的缓冲区
char masterTxBuffer[SPI_MSG_length];//数据保存在此缓冲区中以供发送


空 masterTaskFxn (UARg arg0、UARg arg1)


无符号长整型 ulADC0Value[1];
无符号长整型 ulADC0Value1[14];
volatile unsigned long ulTempAvg;
volatile unsigned long ulTempAvg1;
volatile unsigned long ulTempValueC;
volatile unsigned long ulTempValueF;
// SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_25MHz);
// SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_25MHz);
SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480)、120000000);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//启用 ADC0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);//启用端口 E
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_1);//定义引脚 PE1

ADCSequenceDisable (ADC0_BASE、3);
ADCSequenceDisable (ADC0_BASE、2);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceConfigure (ADC0_BASE、2、ADC_TRIGGER_PROCESSOR、0);
//通道2 PE1
ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、2、1、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、2、2、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、2、0、ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END);
//通道 TS
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);
ADCSequenceEnable (ADC0_BASE、2);
//********
ADCProcessorTrigger (ADC0_BASE、3);
ADCProcessorTrigger (ADC0_BASE、2);
//等待转换
while (!ADCIntStatus (ADC0_BASE、3、false)){}
while (!ADCIntStatus (ADC0_BASE、2、false)){}
//获取值
ADCSequenceDataGet (ADC0_BASE、3、ulADC0Value);
ADCSequenceDataGet (ADC0_BASE、2、ulADC0Value1);
ulTempAvg =(ulADC0Value[0]);
ulTempAvg1 =(ulADC0Value1[0]+ulADC0Value1[1]+ulADC0Value1[2]+ulADC0Value1[3])/4;
ulTempValueC =(1475 -((2475 * ulTempAvg))/ 4096)/10;
ADCIntClear (ADC0_BASE、3);
ADCIntClear (ADC0_BASE、2);
//*******

void maasterTaskFxn (UArg0、UArgarg1)

System_printf ("------------------------------------------ 新-------------------------------------- ");

/*
*==== main ====
*
void main (void)

Task_Params taskParams;
Board_initGeneral();
Board_initGPIO();
Board_initSPI();
GPIO_WRITE (Board_LED0、Board_LED_ON);//引脚编号 PQ7处的新芯片选择设置为高电平
Task_Params_init (&taskParams);//初始化任务
taskParams.priority = 1;//任务参数
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr) masterTaskFxn、&taskParams、NULL);


Task_Params_init (&taskParams);//初始化任务
taskParams.priority = 2;//任务参数
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr) maasterTaskFxn、&taskParams、NULL);

//GPIO_WRITE (Board_LED0、Board_LED_OFF);
system_flush();
System_printf ("------------------------------------------ 新-------------------------------------- ");
system_flush();
/*启动 BIOS */
BIOS_start();//在 BIOS 中启动任务。
//返回(0);
while (1);

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

    任务通常永远存在。 例如

    空 masterTaskFxn (UARg arg0、UARg arg1)

    //任何设置
    while (1){
    Semaphore_pend (semHandle、BIOS_wait_forever);
    //一旦发出信号就执行一些操作


    与信标不同、同步的其他常见方法是邮箱、事件和轮询。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    IM 在 main 中使用 while (1)、而我不使用信标、因此我的代码不会同步运行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要调用 BIOS_start 来启动内核。 BIOS_start 永不返回。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是否得到了解决?

    [更新日期:6/11:无响应、因此标记为"TI 认为已解决"。 如果您不同意、请发布回复]