欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

FreeRTOS實(shí)時(shí)操作系統(tǒng)移植操作示例指南

 更新時(shí)間:2022年04月06日 13:19:07   作者:淺毅  
這篇文章主要為大家介紹了FreeRTOS移植操作示例指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

1.添加FreeRTOS源碼

在基礎(chǔ)工程中新建一個(gè)名為 FreeRTOS 的文件夾,將 FreeRTOS 的源碼(source文件夾下的內(nèi)容)添加到這個(gè)文件夾中

portable文件夾中,只需留下 keil、MemMang 和 RVDS這三個(gè)文件夾,其他的都可以刪除掉。

2.向工程分組中添加文件

打開基礎(chǔ)工程,新建分組 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向這兩個(gè)分組中添加文件

 port.c 是 RVDS 文件夾下的 ARM_CM4F 中的文件,因?yàn)?STM32F429 是 Cortex-M4 內(nèi)核并且?guī)в?FPU,因此要選擇 ARM_CM4F 中的 port.c 文件。heap_4.c 是 MemMang 文件夾中的,MemMang 文件夾中的五個(gè)內(nèi)存管理方案后面再講。

添加完 FreeRTOS 源碼中的 C 文件以后再添加 FreeRTOS 源碼的頭文件路徑。

編譯后發(fā)現(xiàn),缺少“FreeRTOSConfig.h”這個(gè)文件,這可文件可以去FreeRTOS的官方Demo中拷貝一份過來。本人已經(jīng)對(duì)其做了相應(yīng)的修改,并注釋好,里面的內(nèi)容我將在下一章貼上并對(duì)其進(jìn)行相應(yīng)的注解。

然后,由于FreeRTOS已經(jīng)幫我們實(shí)現(xiàn)了PendSV_Handler()和SVC_Handler()函數(shù),所以我們?cè)趕tm32f4xx_it.c中注釋掉這兩個(gè)函數(shù)。而SysTickHandler()這個(gè)函數(shù)我們不需要FreeRTOS幫我們實(shí)現(xiàn),而是我們自行在delay.c中實(shí)現(xiàn),

附上delay.c和delay.h的代碼

#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{	
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
        xPortSysTickHandler();
      }
}
static u8 fac_us=0;							    //us延時(shí)倍乘數(shù)
static u16 fac_ms=0;							//ms延時(shí)倍乘數(shù)
void delay_init()
{
    u32 reload;
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 
    fac_us=SystemCoreClock/1000000;         //系統(tǒng)還沒運(yùn)行,以Systick計(jì)時(shí)
 
    reload=SystemCoreClock/configTICK_RATE_HZ;    //configTICK_RATE_HZ=1000
    
    fac_ms=1000/configTICK_RATE_HZ;         //系統(tǒng)已經(jīng)運(yùn)行,這就是個(gè)節(jié)拍數(shù),用于給系統(tǒng)提供的延遲函數(shù)
 
    SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//開啟SYSTICK中斷
    SysTick->LOAD=reload;                    //每1/configTICK_RATE_HZ斷一次	
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //開啟SYSTICK     
}
 
//延遲us,不會(huì)引起任務(wù)切換
//注意:nus的值,不要大于23860929us(最大值即2^32/fac_us@fac_us=180) 
void delay_us(u32 nus)
{		
    u32 ticks;
    u32 told,tnow,tcnt=0;
    u32 reload=SysTick->LOAD;				//LOAD的值	    	 
    ticks=nus*fac_us; 						//需要的節(jié)拍數(shù) 
    told=SysTick->VAL;        				//剛進(jìn)入時(shí)的計(jì)數(shù)器值
    while(1)
    {
        tnow=SysTick->VAL;	
        if(tnow!=told)
        {	    
            if(tnow<told)tcnt+=told-tnow;	//這里注意一下SYSTICK是一個(gè)遞減的計(jì)數(shù)器就可以了.
            else tcnt+=reload-tnow+told;	    
            told=tnow;
            if(tcnt>=ticks)break;			//時(shí)間超過/等于要延遲的時(shí)間,則退出.
        }  
    }
}
//延時(shí)nms,其實(shí)就是對(duì)會(huì)vTaskDelay的簡單封裝,會(huì)引起任務(wù)調(diào)度
//nms:要延時(shí)的ms數(shù)
//nms:0~65535
void delay_ms(u32 nms)
{	
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系統(tǒng)已經(jīng)運(yùn)行
	{		
		if(nms>=fac_ms)						//延時(shí)的時(shí)間大于OS的最少時(shí)間周期 
		{ 
   			vTaskDelay(nms);	 		//FreeRTOS延時(shí):vTaskDelay演示固定的時(shí)鐘節(jié)拍,由于前面設(shè)定了頻率為1000HZ,所以一個(gè)節(jié)拍就是1ms
		}
		nms%=fac_ms;						//OS已經(jīng)無法提供這么小的延時(shí)了,采用普通方式延時(shí)    
	}
	delay_us((u32)(nms*1000));				//普通方式延時(shí)
}
//延時(shí)nms,不會(huì)引起任務(wù)切換
//nms:要延時(shí)的ms數(shù)
void delay_xms(u32 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}
//延時(shí)ms:不會(huì)引起任務(wù)切換
//注意nms的范圍
//SysTick->LOAD為24位寄存器
//對(duì)180M條件下,nms<=23860ms (最大值即2^32/fac_ms@fac_ms=180*1000) 
/*void delay_ms(u16 nms)
{	 		  	  
    u32 ticks;
    u32 told,tnow,tcnt=0;
    u32 reload=SysTick->LOAD;				//LOAD的值	    	 
    ticks=nms*fac_ms; 						//需要的節(jié)拍數(shù) 
    told=SysTick->VAL;        				//剛進(jìn)入時(shí)的計(jì)數(shù)器值
    while(1)
    {
        tnow=SysTick->VAL;	
        if(tnow!=told)
        {	    
            if(tnow<told)tcnt+=told-tnow;	//這里注意一下SYSTICK是一個(gè)遞減的計(jì)數(shù)器就可以了.
            else tcnt+=reload-tnow+told;	    
            told=tnow;
            if(tcnt>=ticks)break;			//時(shí)間超過/等于要延遲的時(shí)間,則退出.
        }  
    } 	    
}*/

以上就是FreeRTOS移植操作示例指南的詳細(xì)內(nèi)容,更多關(guān)于FreeRTOS移植的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論