初中生
最后登录1970-1-1
在线时间 小时
注册时间2021-4-12
|
本帖最后由 陈笙 于 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) 可不可帮忙看下,谢谢啦。
串口输出也不正常
这个是PDF上面的正常输出。
我用LED灯调试,到这个地方没反应。
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(); //退出临界段
}
}
|
|