13.2 任务功能划分 前面第三章已经将任务功能划分好: 根据这个功能划分,创建所需要的任务。另外,RTX本身是不支持CPU利用率统计的,所以专门创建了一个任务实现CPU利用率统计。
13.2.1 主函数创建 在main.c文件实现: - /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 6, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
复制代码硬件外设的初始化函数bsp_Init是在 bsp.c 文件实现: - /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
-
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- SystemCoreClockUpdate(); /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
-
- bsp_InitDWT(); /* 初始化DWT */
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
-
- bsp_InitI2C(); /* 配置I2C总线 */
-
- bsp_InitExtSDRAM();
- bsp_DetectLcdType(); /* 检测触摸板和LCD面板型号, 结果存在全局变量 g_TouchType, g_LcdType */
-
- TOUCH_InitHard(); /* 初始化配置触摸芯片 */
- LCD_ConfigLTDC(); /* 初始化配置LTDC */
-
- DSO_ConfigCtrlGPIO(); /* 初始化示波器模块的引脚配置 */
-
- bsp_InitADC(); /* 初始化ADC1,ADC2和ADC3 */
- bsp_InitDAC1(); /* 初始化DAC1 */
-
- g_DAC1.ucDuty = 50; /* 初始化DAC配置,用于信号发生器 */
- g_DAC1.ucWaveType = 0;
- g_DAC1.ulAMP = 4095;
- g_DAC1.ulFreq = 10000;
- dac1_SetSinWave(g_DAC1.ulAMP, g_DAC1.ulFreq);
-
- MountSD(); /* 挂载SD卡 */
-
- TIM8_MeasureTrigConfig(); /* 初始化TIM8用于记录一段波形 */
- }
复制代码创建任务的主要功能是硬件外设初始化和启动任务的创建,相对比较简单。
13.2.2 启动任务(信号处理) 启动任务用于二代示波器的信号处理: 除了信号处理,还有一个重要的功能要在启动任务里面优先实现,就是统计任务的创建和执行,用于统计CPU利用率,实现步骤如下: 1. 进入到启动任务后,其它任何任务都不要创建,先创建一个统计任务,不让执行。 2. 启动任务延迟100ms,延迟的这100ms时间基本都是空闲任务在执行,在空闲任务里面做32位变量加1计算。我们就以这100ms,变量计数的最大值作为CPU利用率的分母。 3. 然后开启统计任务的执行,每100ms执行一次,统计即可。空闲任务此时的计数值作为分子。通过这种方式就实现了CPU利用率的统计。
统计任务执行后就是任务间通信机制函数AppObjCreate(动态内存分配也是在这个函数里面实现,在本章13.4小节有说明)和任务创建函数AppTaskCreate,代码比较简单,我们这里就不贴出来了。 说完了前面这些,最重要的还是信号处理。根据不同的事件标志处理不同的功能,任务里面主要是分为了两类: 1、双通道波形数据处理 主要实现软件触发,计算FFT ,FIR ,RMS,最大值,最小值,平均值和峰峰值。两个通道都进行了处理。具体实现方法已经在前面章节为大家做了讲解。 2、另一个是简单电压测量处理 这个功能比较简单,就是获取一组ADC数值,然后求平均。
13.2.3 统计任务 统计任务的实现代码如下: 统计任务的实现思路就是前面13.2.2小节中介绍的方法。这个统计任务的实现思路是由uCOS-II修改而来的,如果大家研究过uCOS-II的源码,这里的代码还是比较好理解的。没有研究过也没有关系,直接根据13.2.2小节里面介绍的思路看统计任务的实现代码即可。
13.2.4 GUI任务 emWin任务的实现代码如下: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUI
- * 功能说明: GUI任务。
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: 2
- *********************************************************************************************************
- */
- __task void AppTaskGUI(void)
- {
- while(1)
- {
- MainTask();
- }
- }
复制代码emWin的代码都是在函数MainTask里面实现,这样做是方便在main.c文件里面统一管理任务。关于GUI部分最重要的界面优化,波形刷新优化,波形浏览等,在前面章节已经都做了讲解,我们这里不再赘述。更详细的实现,需要结合前面章节的讲解去看源码。
13.2.5 用户接口任务 这个任务暂时未执行任何功能,保留供以后升级使用。代码如下: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskUserIF
- * 功能说明: 保留,暂未使用。
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: 3
- *********************************************************************************************************
- */
- __task void AppTaskUserIF(void)
- {
- while(1)
- {
- os_dly_wait(2000);
- }
- }
复制代码
13.2.6 文件系统处理任务 当前文件系统处理任务主要用来做截图功能,将GUI界面以BMP格式存储到SD卡里面: 后期这个任务将被升级,用于将波形数据以CSV文件格式存储到SD卡里面。
13.2.7 触摸和按键任务 触摸和按键任务实现的功能比较简单,主要是按键扫描和触摸扫描: - /*
- *********************************************************************************************************
- * 函 数 名: AppTaskMsgPro
- * 功能说明: 按键和触摸检测
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: 5
- *********************************************************************************************************
- */
- __task void AppTaskMsgPro(void)
- {
- uint8_t ucCount = 0;
-
-
- while(1)
- {
- /* 1ms一次触摸扫描,电阻触摸屏 */
- if(g_tTP.Enable == 1)
- {
- TOUCH_Scan();
-
- /* 按键扫描 */
- ucCount++;
- if(ucCount == 10)
- {
- ucCount = 0;
- bsp_KeyScan();
- }
- os_dly_wait(1);
- }
-
- /* 10ms一次触摸扫描,电容触摸屏GT811 */
- if(g_GT811.Enable == 1)
- {
- bsp_KeyScan();
- GT811_OnePiontScan();
- os_dly_wait(10);
- }
-
- /* 10ms一次触摸扫描,电容触摸屏FT5X06 */
- if(g_tFT5X06.Enable == 1)
- {
- bsp_KeyScan();
- FT5X06_OnePiontScan();
- os_dly_wait(10);
- }
- }
- }
复制代码
知识点拓展: 新版emWin教程第4章或者第5章,对触摸的实现做了详细讲解:
|