OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7192|回复: 4

求助;FreeRTOS 中断测试实验问题

[复制链接]

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-12-27
在线时间
16 小时
发表于 2019-2-18 17:38:55 | 显示全部楼层 |阅读模式
1金钱
代码如下:

#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"
#include "misc.h"
#include "timer.h"

#define START_TASK_PRIO  1  //任务优先级
#define START_STK_SIZE 256 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数
#define INTERRUPT_TASK_PRIO  2  //任务优先级
#define INTERRUPT_STK_SIZE 256 //任务堆栈大小
TaskHandle_t INTERRUPTTask_Handler; //任务句柄
void interrupt_task(void *p_arg); //任务函数

//定时器 3 中断服务函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
    {
        printf("TIM3 输出.......\r\n");
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
//定时器 5 中断服务函数
void TIM5_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //溢出中断
    {
        printf("TIM5 输出.......\r\n");
    }
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除中断标志位
}

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//FreeRTOS 的中断配置没有处理亚优先级这种情况,所以只能配置为组 4,直接就 16 个优先级,使用起来也简单!
    delay_init(168);
    uart_init(115200);
    LED_Init();                //初始化LED端口
    TIM3_Int_Init(10000-1,8400-1); //初始化定时器 3,定时器周期 1S
    TIM5_Int_Init(10000-1,8400-1); //初始化定时器 5,定时器周期 1S
    //创建开始任务
    xTaskCreate((TaskFunction_t )start_task, //任务函数
    (const char* )"start_task", //任务名称
    (uint16_t )START_STK_SIZE, //任务堆栈大小
    (void* )NULL, //传递给任务函数的参数
    (UBaseType_t )START_TASK_PRIO, //任务优先级
    (TaskHandle_t* )&StartTask_Handler); //任务句柄
    vTaskStartScheduler(); //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL(); //进入临界区
    //创建中断测试任务
    xTaskCreate((TaskFunction_t )interrupt_task, //任务函数  (1)
    (const char* )"interrupt_task", //任务名称
    (uint16_t )INTERRUPT_STK_SIZE, //任务堆栈大小
    (void* )NULL, //传递给任务函数的参数
    (UBaseType_t )INTERRUPT_TASK_PRIO, //任务优先级
    (TaskHandle_t* )&INTERRUPTTask_Handler); //任务句柄
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL(); //退出临界区
}

//中断测试任务函数
void interrupt_task(void *pvParameters)
{
    static u32 total_num=0;
    while(1)
    {
        total_num+=1;
        if(total_num==5)
        {
            printf("关闭中断.............\r\n");
            portDISABLE_INTERRUPTS(); //关闭中断  
            delay_xms(5000); //延时 5s
            printf("打开中断.............\r\n");  //打开中断
            portENABLE_INTERRUPTS();
        }
        LED0=~LED0;
        vTaskDelay(1000);
    }
}
按照正点原子F407 FreeRTOS移植实验走的,但是我的结果只会出现这个,其他就没了,程序跑的过程中好像卡在 vTaskStartScheduler();这句话上了,想问问各位大神,有可能是哪里的问题?



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-12-27
在线时间
16 小时
 楼主| 发表于 2019-2-18 17:41:31 | 显示全部楼层
串口只能输出一句:
TIM3 输出.......
TIM5 输出.......

之后就没了
回复

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2018-12-27
在线时间
16 小时
 楼主| 发表于 2019-2-18 17:53:17 | 显示全部楼层
void vTaskStartScheduler( void )
{
BaseType_t xReturn;

        /* Add the idle task at the lowest priority. */
        #if( configSUPPORT_STATIC_ALLOCATION == 1 )
        {
                StaticTask_t *pxIdleTaskTCBBuffer = NULL;
                StackType_t *pxIdleTaskStackBuffer = NULL;
                uint32_t ulIdleTaskStackSize;

                /* The Idle task is created using user provided RAM - obtain the
                address of the RAM then create the idle task. */
                vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );
                xIdleTaskHandle = xTaskCreateStatic(        prvIdleTask,
                                                                                                configIDLE_TASK_NAME,
                                                                                                ulIdleTaskStackSize,
                                                                                                ( void * ) NULL, /*lint !e961.  The cast is not redundant for all compilers. */
                                                                                                portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */
                                                                                                pxIdleTaskStackBuffer,
                                                                                                pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */

                if( xIdleTaskHandle != NULL )
                {
                        xReturn = pdPASS;
                }
                else
                {
                        xReturn = pdFAIL;
                }
        }
        #else
        {
                /* The Idle task is being created using dynamically allocated RAM. */
                xReturn = xTaskCreate(        prvIdleTask,
                                                                configIDLE_TASK_NAME,
                                                                configMINIMAL_STACK_SIZE,
                                                                ( void * ) NULL,
                                                                portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */
                                                                &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
        }
        #endif /* configSUPPORT_STATIC_ALLOCATION */

        #if ( configUSE_TIMERS == 1 )
        {
                if( xReturn == pdPASS )
                {
                        xReturn = xTimerCreateTimerTask();
                }
                else
                {
                        mtCOVERAGE_TEST_MARKER();
                }
        }
        #endif /* configUSE_TIMERS */

        if( xReturn == pdPASS )
        {
                /* freertos_tasks_c_additions_init() should only be called if the user
                definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is
                the only macro called by the function. */
                #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT
                {
                        freertos_tasks_c_additions_init();
                }
                #endif

                /* Interrupts are turned off here, to ensure a tick does not occur
                before or during the call to xPortStartScheduler().  The stacks of
                the created tasks contain a status word with interrupts switched on
                so interrupts will automatically get re-enabled when the first task
                starts to run. */
                portDISABLE_INTERRUPTS();

                #if ( configUSE_NEWLIB_REENTRANT == 1 )
                {
                        /* Switch Newlib's _impure_ptr variable to point to the _reent
                        structure specific to the task that will run first. */
                        _impure_ptr = &( pxCurrentTCB->xNewLib_reent );
                }
                #endif /* configUSE_NEWLIB_REENTRANT */

                xNextTaskUnblockTime = portMAX_DELAY;
                xSchedulerRunning = pdTRUE;
                xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;

                /* If configGENERATE_RUN_TIME_STATS is defined then the following
                macro must be defined to configure the timer/counter used to generate
                the run time counter time base.   NOTE:  If configGENERATE_RUN_TIME_STATS
                is set to 0 and the following line fails to build then ensure you do not
                have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your
                FreeRTOSConfig.h file. */
                portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();

                traceTASK_SWITCHED_IN();

                /* Setting up the timer tick is hardware specific and thus in the
                portable interface. */
                if( xPortStartScheduler() != pdFALSE )      //跑到这一句的时候,就直接进入到void HardFault_Handler(void)这个函数里面了。
                {
                        /* Should not reach here as if the scheduler is running the
                        function will not return. */
                }
                else
                {
                        /* Should only reach here if a task calls xTaskEndScheduler(). */
                }
        }
        else
        {
                /* This line will only be reached if the kernel could not be started,
                because there was not enough FreeRTOS heap to create the idle task
                or the timer task. */
                configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY );
        }

        /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0,
        meaning xIdleTaskHandle is not used anywhere else. */
        ( void ) xIdleTaskHandle;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-2-19 01:24:24 | 显示全部楼层
帮顶
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 2021-2-15 13:21:27 | 显示全部楼层
请问楼主的问题解决了吗?我现在也遇到这个问题,最后进入调度是卡死在if( xPortStartScheduler() != pdFALSE )这个位置,注释说的是,如果程序成功运行是不会运行到这个位置的,也没有多余的参考信息,
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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