加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PIC24H中高速UART中断的FreeRTOS错误

发布时间:2020-12-16 07:06:18 所属栏目:百科 来源:网络整理
导读:我已经将FreeRTOS用于一些嵌入式项目一段时间了,直到现在它仍然非常完美.目前我正面临着在FreeRTOS移植到PIC24H时使用高速中断相关的难题,希望大家能帮助我解决这个问题.提前致谢 我创建了一个简单测试的小型演示项目: 两个任务: // Task 1if (xTaskCreate
我已经将FreeRTOS用于一些嵌入式项目一段时间了,直到现在它仍然非常完美.目前我正面临着在FreeRTOS移植到PIC24H时使用高速中断相关的难题,希望大家能帮助我解决这个问题.提前致谢

我创建了一个简单测试的小型演示项目:

两个任务:

// Task 1

if (xTaskCreate(RTOSTask_1,(signed char) "[T1]",configMINIMAL_STACK_SIZE2,NULL,tskIDLE_PRIORITY + 1,&hTask1) == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY)
{
  LREP("rnCannot create Task 1.");   
  Display_Error(1000);
}

// Task 2

if (xTaskCreate(RTOSTask_2,(signed char) "[T2]",tskIDLE_PRIORITY + 2,&hTask2) == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY)
{
  LREP("rnCannot create Task 2."); 
  Display_Error(1000);  
}

执行任务:

void RTOSTask_1(void* pvParameter)
{ 
  while(1)
  {

    if (xSemaphoreTake(hTask1Semaphore,portMAX_DELAY) == pdTRUE)
    { 
      putchar1('1');
    } 
  }
}

void RTOSTask_2(void* pvParameter)
{
  while(1)
  {
    if (xSemaphoreTake(hTask2Semaphore,portMAX_DELAY) == pdTRUE)
    { 
       putchar1('2');
    } 

   }
}

让上面的两个任务运行我使用一个Timer&一个UART给他们信号量:

void attribute((interrupt,auto_psv)) _T2Interrupt (void)
{ 
  _T2IF = 0;
  static signed portBASE_TYPE xTaskWoken = pdFALSE;
  xSemaphoreGiveFromISR(hTask1Semaphore,&xTaskWoken );

  if( xTaskWoken != pdFALSE )
  {
    taskYIELD();
  }
}

void attribute((interrupt,auto_psv)) _U1TXInterrupt()
{

  _U1TXIF = 0;
  putchar1('E');
} 

void attribute((interrupt,auto_psv)) _U1RXInterrupt()
{

  _U1RXIF = 0;
  if(U1STAbits.URXDA == 1)
  {
    uint8 u8Recv = U1RXREG;
  }

  static signed portBASE_TYPE xTaskWoken;

  xTaskWoken = pdFALSE;

  xSemaphoreGiveFromISR(hTask2Semaphore,&xTaskWoken);


  if( xTaskWoken != pdFALSE )
  {
    taskYIELD();
  }
}

我的定时器每100us中断一次,UART以230400 bps的波特率工作.

运行一些秒或几分钟后程序崩溃,程序跳转到Traps:

_AddressError或

_StackError

我不知道这个问题会怎么样.经过长时间的调查和测试我认为当程序在&运行时发生问题用完中断服务程序(ISR).看来我们需要一些SAVE_CONTEXT()& RESTORE_CONTEXT()函数.但在PIC24端口上没有这样的人.

请你帮我个问一下这个问题

谢谢你们 !

我想,我已经发现了我的问题.当PIC24H进入&时,会引入该问题.获得中断服务程序,这里是UART RX,TX,定时器中断.

目前我不使用这样的ISR:

void属性((interrupt,auto_psv))

而不是它我用汇编代码自己创建了一个机制:

__U1RXInterrupt:
????????;将CPU寄存器推入堆栈

PUSH    SR          
PUSH    W0
PUSH    W1          
PUSH.D  W2
PUSH.D  W4
PUSH.D  W6
PUSH.D  W8
PUSH.D  W10
PUSH.D  W12
PUSH    W14
PUSH    RCOUNT
PUSH    TBLPAG
PUSH    CORCON
PUSH    PSVPAG

    ; Call my ISR
    call _UART1_RxISRHandler        

    ; Pop out CPU registers
POP PSVPAG
POP CORCON
POP TBLPAG
POP RCOUNT                  
POP W14
POP.D   W12
POP.D   W10
POP.D   W8
POP.D   W6
POP.D   W4
POP.D   W2
POP.D   W0
POP SR


retfie

UART1_RxISRHandler是我的ISR实现.我对TX,定时器中断做同样的事情.

结果是我的程序运行更顺畅,更长时间1小时(仅在1-5分钟后程序崩溃之前).但最终在运行1-2小时后仍然会崩溃.这意味着我的方法是正确的,但仍然有问题.可能是我错过了上面的代码.

如果您对这种情况都有任何理想,请告诉我.

谢谢

解决方法

我有类似的问题.

你的uart中断的优先级是什么?

它不应高于设置到FreeRTOSConfig.h中的RTOS内核中断优先级,其默认优先级为1,而PIC中断的默认优先级为3.

这似乎导致了偶尔的崩溃.

SAVE_CONTEXT()& PIC不需要RESTORE_CONTEXT(),因为编译器可以解决这个问题,至少在使用编译器函数声明并避免使用_FASTISR或阴影时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读