野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9345|回复: 1

[ucos] 求助:ucos例程串口DMA空闲中断接收不到数据 论坛有相同问题

[复制链接]
发表于 2021-4-26 21:19:54 | 显示全部楼层 |阅读模式
本帖最后由 陈笙 于 2021-4-26 21:21 编辑

在学习ucos第二部分 中断管理 章节遇到的问题。(直接跑的例程)
求助:ucos例程串口DMA空闲中断接收不到数据 刚才看了下论坛有相同问题也没有解决(https://www.firebbs.cn/forum.php?mod=viewthread&tid=30250&highlight=%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD) 可不可帮忙看下,谢谢啦。
串口输出也不正常
野火论坛202104262111055574..png
这个是PDF上面的正常输出。
野火论坛202104262115195197..png
我用LED灯调试,到这个地方没反应
野火论坛202104262113163460..png
app.c代码如下:
/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include <includes.h>
#include <string.h>


/*
*********************************************************************************************************
*                                            LOCAL DEFINES
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                                 TCB
*********************************************************************************************************
*/

static  OS_TCB   AppTaskStartTCB;    //任务控制块

OS_TCB           AppTaskUsartTCB;
OS_TCB           AppTaskKeyTCB;


/*
*********************************************************************************************************
*                                                STACKS
*********************************************************************************************************
*/

static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];       //任务堆栈

static  CPU_STK  AppTaskUsartStk [ APP_TASK_USART_STK_SIZE ];
static  CPU_STK  AppTaskKeyStk   [ APP_TASK_KEY_STK_SIZE ];

extern char Usart_Rx_Buf[USART_RBUFF_SIZE];

/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void  AppTaskStart  (void *p_arg);               //任务函数声明

static  void  AppTaskUsart  ( void * p_arg );
static  void  AppTaskKey    ( void * p_arg );


/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Arguments   : none
*
* Returns     : none
*********************************************************************************************************
*/

int  main (void)
{
    OS_ERR  err;

        
    OSInit(&err);                                                           //初始化 uC/OS-III

          /* 创建起始任务 */
    OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                            //任务控制块地址
                 (CPU_CHAR   *)"App Task Start",                            //任务名称
                 (OS_TASK_PTR ) AppTaskStart,                               //任务函数
                 (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                 (OS_PRIO     ) APP_TASK_START_PRIO,                        //任务的优先级
                 (CPU_STK    *)&AppTaskStartStk[0],                         //任务堆栈的基地址
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,               //任务堆栈空间剩下1/10时限制其增长
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,                    //任务堆栈空间(单位:sizeof(CPU_STK))
                 (OS_MSG_QTY  ) 5u,                                         //任务可接收的最大消息数
                 (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                 (void       *) 0,                                          //任务扩展(0表不扩展)
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                 (OS_ERR     *)&err);                                       //返回错误类型

    OSStart(&err);                                                          //启动多任务管理(交由uC/OS-III控制)

}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Arguments   : p_arg   is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns     : none
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
    CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;
    OS_ERR      err;


    (void)p_arg;

    BSP_Init();                                                 //板级初始化
    CPU_Init();                                                 //初始化 CPU 组件(时间戳、关中断时间测量和主机名)

    cpu_clk_freq = BSP_CPU_ClkFreq();                           //获取 CPU 内核时钟频率(SysTick 工作时钟)
    cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;        //根据用户设定的时钟节拍频率计算 SysTick 定时器的计数值
    OS_CPU_SysTickInit(cnts);                                   //调用 SysTick 初始化函数,设置定时器计数值和启动定时器

    Mem_Init();                                                 //初始化内存管理组件(堆内存池和内存池表)

#if OS_CFG_STAT_TASK_EN > 0u                                    //如果使能(默认使能)了统计任务
    OSStatTaskCPUUsageInit(&err);                               //计算没有应用任务(只有空闲任务)运行时 CPU 的(最大)
#endif                                                          //容量(决定 OS_Stat_IdleCtrMax 的值,为后面计算 CPU
                                                                //使用率使用)。
    CPU_IntDisMeasMaxCurReset();                                //复位(清零)当前最大关中断时间


    /* 配置时间片轮转调度 */               
    OSSchedRoundRobinCfg((CPU_BOOLEAN   )DEF_ENABLED,          //使能时间片轮转调度
                                     (OS_TICK       )0,                    //把 OSCfg_TickRate_Hz / 10 设为默认时间片值
                                                                                                 (OS_ERR       *)&err );               //返回错误类型

                                                         
                                                         
                /* 创建 AppTaskUsart 任务 */
    OSTaskCreate((OS_TCB     *)&AppTaskUsartTCB,                            //任务控制块地址
                 (CPU_CHAR   *)"App Task Usart",                            //任务名称
                 (OS_TASK_PTR ) AppTaskUsart,                               //任务函数
                 (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                 (OS_PRIO     ) APP_TASK_USART_PRIO,                        //任务的优先级
                 (CPU_STK    *)&AppTaskUsartStk[0],                         //任务堆栈的基地址
                 (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE / 10,               //任务堆栈空间剩下1/10时限制其增长
                 (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE,                    //任务堆栈空间(单位:sizeof(CPU_STK))
                 (OS_MSG_QTY  ) 50u,                                        //任务可接收的最大消息数
                 (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                 (void       *) 0,                                          //任务扩展(0表不扩展)
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                 (OS_ERR     *)&err);                                       //返回错误类型
                                                                 
                                                                 
                /* 创建 AppTaskKey 任务 */
    OSTaskCreate((OS_TCB     *)&AppTaskKeyTCB,                              //任务控制块地址
                 (CPU_CHAR   *)"App Task Key",                              //任务名称
                 (OS_TASK_PTR ) AppTaskKey,                                 //任务函数
                 (void       *) 0,                                          //传递给任务函数(形参p_arg)的实参
                 (OS_PRIO     ) APP_TASK_KEY_PRIO,                          //任务的优先级
                 (CPU_STK    *)&AppTaskKeyStk[0],                           //任务堆栈的基地址
                 (CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE / 10,                 //任务堆栈空间剩下1/10时限制其增长
                 (CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE,                      //任务堆栈空间(单位:sizeof(CPU_STK))
                 (OS_MSG_QTY  ) 50u,                                        //任务可接收的最大消息数
                 (OS_TICK     ) 0u,                                         //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)
                 (void       *) 0,                                          //任务扩展(0表不扩展)
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项
                 (OS_ERR     *)&err);                                       //返回错误类型

                                                                 
                OSTaskDel ( 0, & err );                     //删除起始任务本身,该任务不再运行
               
               
}


/*
*********************************************************************************************************
*                                          USART TASK
*********************************************************************************************************
*/
static  void  AppTaskUsart ( void * p_arg )
{
        OS_ERR         err;

        CPU_SR_ALLOC();
        

        (void)p_arg;
        
                                         
        while (DEF_TRUE) {                                           //任务体
               
                OSTaskSemPend ((OS_TICK   )0,                     //无期限等待
                                                                         (OS_OPT    )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                                                                         (CPU_TS   *)0,                     //获取信号量被发布的时间戳
                                                                         (OS_ERR   *)&err);                 //返回错误类型
                //程序执行到这里没有反应?
                OS_CRITICAL_ENTER();                                       //进入临界段,避免串口打印被打断

    printf("收到数据:%s\n",Usart_Rx_Buf);

    memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */

                OS_CRITICAL_EXIT();                                        //退出临界段
               
        
               
        }
        
}


/*
*********************************************************************************************************
*                                          KEY TASK
*********************************************************************************************************
*/
static  void  AppTaskKey ( void * p_arg )
{
        OS_ERR         err;
        CPU_TS_TMR     ts_int;
        CPU_INT32U     cpu_clk_freq;
        CPU_SR_ALLOC();

        
        (void)p_arg;

                                         
  cpu_clk_freq = BSP_CPU_ClkFreq();                   //获取CPU时钟,时间戳是以该时钟计数

        
        while (DEF_TRUE) {                                  //任务体
                /* 阻塞任务,直到KEY1被按下 */
                OSTaskSemPend ((OS_TICK   )0,                     //无期限等待
                                                                         (OS_OPT    )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                                                                         (CPU_TS   *)0,                     //获取信号量被发布的时间戳
                                                                         (OS_ERR   *)&err);                 //返回错误类型
               
                ts_int = CPU_IntDisMeasMaxGet ();                 //获取最大关中断时间
        
                OS_CRITICAL_ENTER();                              //进入临界段,避免串口打印被打断
               
                printf ( "触发按键中断,最大中断时间是%dus\r\n",
                                                ts_int / ( cpu_clk_freq / 1000000 ) );                        
               
                OS_CRITICAL_EXIT();                               //退出临界段
               
        }
        
}










回复

使用道具 举报

发表于 2021-6-26 11:14:46 | 显示全部楼层
串口和dma配置的代码发上来看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 06:33 , Processed in 0.046054 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表