上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        mcu一般有两个用途,一个是控制,一个是非控制。控制类的应用一般要求实时性比较高,什么时候做什么,都是有严格的时间要求的。而非控制类的应用,则要求实现尽可能多的功能,比如文件系统、网络、存储、屏幕什么的,通通都需要加上。所以市面上就出现了这一类的设计,在工业或者医疗等领域,一块功能板上面有两块mcu,一块性能高一点,用作通用功能和人机交互;另外一块性能中等一点,用作控制使用。

        另外现在工厂里面网络设备越来越多,mcu接入网络成为一个大趋势,所以就想着给mcu添加一个phy芯片,移植上lwip。后来发现,要想移植lwip,最好先port一个rtos。目前rtos里面,免费的好像只有freertos,所以今天正好尝试port一个freertos。

1、借鉴代码

        我们在github上借鉴了一个基于f103的freertos代码,原来的地址在这,这里参考的是它的第一个用例01-FreeRTOS-LED,

https://github.com/Embedfire-freertos/ebf_freertos_peripheral_code_stm32f103_zhinanzhe

2、修改configTOTAL_HEAP_SIZE大小

        编译的时候发现之前编译生成的ZI-data空间过大,

Program Size: Code=9356 RO-data=336 RW-data=148 ZI-data=36580  

        编写代码的时候,我们通常都要考虑ram和flash的大小。一般来说,Code+RO-data+RW-data不要超过flash的最大大小。RW-data + ZI-data不要超过ram的最大大小。这里RW-data指的是已经初始化的全局变量,启动的时候RW-data会从flash copy到ram。而ZI-data则是未初始化的全局变量。整个编译代码的大小,不仅取决于我们编写的汇编文件和c文件,其实还有micro lib库的大小。而我们使用的f103c8t6核心板,上面的ram只有20k,肯定不满足要求,所以需要把configTOTAL_HEAP_SIZE调整为12k。

        同一个系列下面的mcu,不仅仅gpio、timer这些ip资源不同,ram和flash大小也是很重要的一个区分条件,这一点在f103系列mcu上面体现的很明显。这种情况下,我们一般需要去check下,当前map文件中,哪一个文件用的ZI-data最大,这样就找到了root cause。

        当然,除了Code、RO-data、RW-data、ZI-data之外,一般还要考虑下heap和stack大小,这两部分是包含在ram里面的。

3、LED修改为pc13

        核心板上面的led是pc13,这部分需要修改下。其他不需要的LED可以删除。

4、注销之前串口接收中断代码

        这部分在MobaXterm中很容易误触,所以先注释掉这部分代码,

#if 0
	NVIC_Configuration();
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
#endif

5、修改Key_Scan,删除key2

        key_scan之前是循环检测的状态,这部分修改下。另外key2一般用不到,直接删除。

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
	{	
#if 0		
		while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   
#endif
		return 	KEY_ON;	 
	}
	else
		return KEY_OFF;
}

6、确认时钟中断被调用

        在rtos当中,时钟是最重要的推进剂,它驱使着整个rtos往前走。不管是任务切换,还是线程阻塞,都需要这个定时器来驱动。

extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{	
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif  /* INCLUDE_xTaskGetSchedulerState */
}

7、确保编译通过、烧入和验证

        上面的部分都修改过之后,就可以编译烧入了。如果没有什么问题的话,就可以看到pc13位置处的led灯闪烁了。打开串口的话,还可以看到下面这些打印,注意波特率是115200,

8、分析代码main.c

        代码部分还是不复杂的,进入main函数之后,首先BSP_Init初始化一下,接着创建一个入口为AppTaskCreate的任务,然后就开始运行rtos了。在AppTaskCreate当中,继续创建一个LED_Task,接着AppTaskCreate自己退出。最后系统中,就剩下一个LED_Task业务流程在跑。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MCU397部署FreeRTOS是一种常见的嵌入式系统开发方案。FreeRTOS是一个流行的实时操作系统(RTOS),适用于嵌入式系统和微控制器。 首先,要将FreeRTOS部署MCU397上,需要准备以下几个步骤: 1. 下载FreeRTOS:从FreeRTOS官方网站下载适用于MCU397的FreeRTOS版本。根据MCU397的架构选择适当的下载版本。 2. 配置开发环境:根据MCU397的开发环境,配置相应的开发工具和编译器。例如,使用Keil或IAR等常见的嵌入式IDE。 3. 导入FreeRTOS库文件:将下载的FreeRTOS库文件导入到开发工具中的项目中。这些文件包括核心RTOS文件、配置文件和示例应用程序。 4. 配置RTOS:配置FreeRTOS以适应MCU397的特定要求。这包括配置任务调度器、内存管理、中断处理和其他RTOS组件。根据应用程序的需求,可以调整优先级、堆栈大小等参数。 5. 编写应用程序:使用FreeRTOS提供的API和函数编写应用程序。这涉及创建和管理任务、队列、信号量、事件组等RTOS资源。在编程过程中,需要理解FreeRTOS的基本概念和调度算法。 6. 构建和调试:使用开发工具构建应用程序,并将生成的二进制文件烧录到MCU397上。通过调试工具或串口输出,确保应用程序在MCU397上正确运行MCU397部署FreeRTOS可以提供许多优势,例如实时调度、任务管理、系统资源管理等。它使开发人员能够更好地控制和组织嵌入式系统,提高系统的效率和可靠性。同时,结合MCU397的强大功能和FreeRTOS的灵活性,可以实现各种不同的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值