本帖最后由 any012 于 2017-1-16 12:50 编辑 用cube生成了freertos工程,想用串口输出调试信息,参考的安富莱和硬石的教程。 新建工程后,有些相关宏定义需要在freertosconfig.h文件里使能,安富莱教程里是这么说的: ----------------------------------------------------------------------------- 需要在FreeRTOSConfig.h文件中使能如下宏定义: /* Ensure stdint is only used by the compiler, and not assembler. */ #if defined(__ICCARM__) || CC_ARM) GNUC__) #include <stdint.h> extern volatile uint32_t ulHighFrequencyTimerTicks; #endif /* Run time and task stats gathering r elated definitions. */ #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulHighFrequencyTim erTicks = 0ul) #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks ------------------------------------------------------------------------------- 以上部分中的变量ulHighFrequencyTimerTicks,生成工程时自带了。 5个宏定义里,configUSE_TRACE_FACILITY 也是自动生成的; configGENERATE_RUN_TIME_STATS是配置cube选相时,有个选项勾选后会生成的; configUSE_STATS_FORMATTING_FUNCTIONS是自己手动添加进去的; 后两个宏定义,cube生成时是这样的: #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats #define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue 而configureTimerForRunTimeStats()和getRunTimeCounterValue()对应两个weak函数,我修改成这样了: __weak void configureTimerForRunTimeStats(void) { ulHighFrequencyTimerTicks = 0ul; } __weak unsigned long getRunTimeCounterValue(void) { return ulHighFrequencyTimerTicks; // return 0; } 教程里说还要定义个定时器,定时值要比freertos系统定时器要小。 我就用TIM4定义了个基本定时器,在其回调函数里,使ulHighFrequencyTimerTicks自加一。 任务共定义了三个,其中一个是让LED一秒反转一次。一个是一秒调用一次void vTaskList( char * pcWriteBuffer )函数并用串口1输出出来。第三个任务空。 结果LED灯不闪。屏蔽调void vTaskList( char * pcWriteBuffer )这个函数调用,就正常了。 求教:是不是有哪些地方遗漏了?望指出来。 |
评分
查看全部评分
在串口初始化完成后加了句:硬件初始化完成
在任务创建完,任务调度开始前,加了句:FreeRTOS初始化完成
然后串口输出如下:
硬件初始化完成
FreeRTOS初始化完成
=================================================
任务名 任务状态 优先级 剩余栈 任务序号
以上为串口输出的数据,硬件是没问题的。
就是执行到
vTaskList((char *)&pcWriteBuffer);
这一句,就不走了。
虽然声明了信号量,但我建的这两个任务里没用到信号量吧?
TIM2中断优先级设为5.
我参考的例程,给的是2K的栈,我由于用的单片机RAM较小,就给了512字节的栈。结果这个任务里定义了个500字节的数组,不够用了。
评分
查看全部评分
学会了创建简单的任务。但还是不知道在实际中如何应用。
我现在想把串口部分做进去。打算用DMA+空闲中断,那么是不是必须要定义个一个全局变量来存放接收到的数据?
我看例程里都是各任务里再建各自的变量。
那么串口处理部分函数,是不是和任务函数是同级别的关系?都能调用任务API?
在基于RTOS的开发中,各种数据的处理、存取等都应该在任务里面处理,中断和任务之间通过信号进行同步,任务之间也通过信号、Mutex等进行同步,任务之间通过消息队列、Mail等进行数据交换。
可以直接使用串口函数
做RTOS开发时这是最经常出现的问题