主頁 > 作業系統 > 超詳細的FreeRTOS移植全教程——基于srm32

超詳細的FreeRTOS移植全教程——基于srm32

2020-09-14 09:40:04 作業系統

準備

在移植之前,我們首先要獲取到FreeRTOS的官方的原始碼包,這里我們提供兩個下載鏈接:

一個是官網:http://www.freertos.org/
另外一個是代碼托管網站:https://sourceforge.net/projects/freertos/files/FreeRTOS/

這里我們演示如何在代碼托管網站里面下載,打開網站鏈接之后,我們選擇FreeRTOS的最新版本V9.0.0(2016年),盡管現在FreeRTOS的版本已經更新到V10.0.1了,但是我們還是選擇V9.0.0,因為內核很穩定,并且網上資料很多,因為V10.0.0版本之后是亞馬遜收購了FreeRTOS之后才出來的版本,主要添加了一些云端組件,我們本書所講的FreeRTOS是實時內核,采用V9.0.0版本足以,

簡單介紹FreeRTOS

FreeRTOS包含Demo例程和內核原始碼(比較重要,我們就需要提取該目錄下的大部分檔案),
Source檔案夾里面包含的是FreeRTOS內核的源代碼,我們移植FreeRTOS的時候就需要這部分源代碼;
Demo 檔案夾里面包含了FreeRTOS官方為各個單片機移植好的工程代碼,FreeRTOS為了推廣自己,會給各種半導體廠商的評估板寫好完整的工程程式,這些程式就放在Demo這個目錄下,這部分Demo非常有參考價值,
在這里插入圖片描述

Source檔案夾

這里我們再重點分析下FreeRTOS/ Source檔案夾下的檔案,①和③包含的是FreeRTOS的通用的頭檔案和C檔案,這兩部分的檔案試用于各種編譯器和處理器,是通用的,需要移植的頭檔案和C檔案放在②portblle這個檔案夾,
在這里插入圖片描述

portblle檔案夾,是與編譯器相關的檔案夾,在不同的編譯器中使用不同的支持檔案,①中的KEIL就是我們就是我們使用的編譯器,其實KEIL里面的內容跟RVDS里面的內容一樣,所以我們只需要③RVDS檔案夾里面的內容即可,里面包含了各種處理器相關的檔案夾,從檔案夾的名字我們就非常熟悉了,我們學習的STM32有M0、M3、M4等各種系列,FreeRTOS是一個軟體,單片機是一個硬體,FreeRTOS要想運行在一個單片機上面,它們就必須關聯在一起,MemMang檔案夾下存放的是跟記憶體管理相關的源檔案,
在這里插入圖片描述

移植程序

提取原始碼

  1. 首先在我們的STM32裸機工程模板根目錄下新建一個檔案夾,命名為“FreeRTOS”,并且在FreeRTOS檔案夾下新建兩個空檔案夾,分別命名為“src”與“port”,src檔案夾用于保存FreeRTOS中的核心源檔案,也就是我們常說的‘.c檔案’,port檔案夾用于保存記憶體管理以及處理器架構相關代碼,這些代碼FreeRTOS官方已經提供給我們的,直接使用即可,在前面已經說了,FreeRTOS是軟體,我們的開發版是硬體,軟硬體必須有橋梁來連接,這些與處理器架構相關的代碼,可以稱之為RTOS硬體介面層,它們位于FreeRTOS/Source/Portable檔案夾下,
  2. 打開FreeRTOS V9.0.0原始碼,在“FreeRTOSv9.0.0\FreeRTOS\Source”目錄下找到所有的‘.c檔案’,將它們拷貝到我們新建的src檔案夾中,

在這里插入圖片描述

  1. 打開FreeRTOS V9.0.0原始碼,在“FreeRTOSv9.0.0\FreeRTOS\Source\portable”目錄下找到“MemMang”檔案夾與“RVDS”檔案夾,將它們拷貝到我們新建的port檔案夾中

在這里插入圖片描述

  1. 打開FreeRTOS V9.0.0原始碼,在“FreeRTOSv9.0.0\ FreeRTOS\Source”目錄下找到“include”檔案夾,它是我們需要用到FreeRTOS的一些頭檔案,將它直接拷貝到我們新建的FreeRTOS檔案夾中,完成這一步之后就可以看到我們新建的FreeRTOS檔案夾已經有3個檔案夾,這3個檔案夾就包含FreeRTOS的核心檔案,至此,FreeRTOS的原始碼就提取完成,

在這里插入圖片描述

添加到工程

添加FreeRTOSConfig.h檔案
FreeRTOSConfig.h檔案是FreeRTOS的工程組態檔,因為FreeRTOS是可以裁剪的實時操作內核,應用于不同的處理器平臺,用戶可以通過修改這個FreeRTOS內核的配置頭檔案來裁剪FreeRTOS的功能,所以我們把它拷貝一份放在user這個檔案夾下面,
打開FreeRTOSv9.0.0原始碼,在“FreeRTOSv9.0.0\FreeRTOS\Demo”檔案夾下面找到“CORTEX_STM32F103_Keil”這個檔案夾,雙擊打開,在其根目錄下找到這個“FreeRTOSConfig.h”檔案,然后拷貝到我們工程的user檔案夾下即可,等下我們需要對這個檔案進行修改,

創建工程分組
接下來我們在mdk里面新建FreeRTOS/src和FreeRTOS/port兩個組檔案夾,其中FreeRTOS/src用于存放src檔案夾的內容,FreeRTOS/port用于存放port\MemMang檔案夾 與port\RVDS\ARM_CM3檔案夾的內容,
然后我們將工程檔案中FreeRTOS的內容添加到工程中去,按照已經新建的分組添加我們的FreeRTOS工程原始碼,
在FreeRTOS/port分組中添加MemMang檔案夾中的檔案只需選擇其中一個即可,我們選擇“heap_4.c”,這是FreeRTOS的一個記憶體管理原始碼檔案,
添加完成后:

在這里插入圖片描述

** 添加頭檔案路徑**
FreeRTOS的原始碼已經添加到開發環境的組檔案夾下面,編譯的時候需要為這些源檔案指定頭檔案的路徑,不然編譯會報錯,FreeRTOS的原始碼里面只有FreeRTOS\include和FreeRTOS\port\RVDS\ARM_CM3這兩個檔案夾下面有頭檔案,只需要將這兩個頭檔案的路徑在開發環境里面指定即可,同時我們還將FreeRTOSConfig.h這個頭檔案拷貝到了工程根目錄下的user檔案夾下,所以user的路徑也要加到開發環境里面,
在這里插入圖片描述

修改FreeRTOSConfig.h

FreeRTOSConfig.h是直接從demo檔案夾下面拷貝過來的,該頭檔案對裁剪整個FreeRTOS所需的功能的宏均做了定義,有些宏定義被使能,有些宏定義被失能,一開始我們只需要配置最簡單的功能即可,要想隨心所欲的配置FreeRTOS的功能,我們必須對這些宏定義的功能有所掌握,下面我們先簡單的介紹下這些宏定義的含義,然后再對這些宏定義進行修改,

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "stm32f10x.h"
#include "bsp_usart.h"


//針對不同的編譯器呼叫不同的stdint.h檔案
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

//斷言
#define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)

/************************************************************************
 *               FreeRTOS基礎配置配置選項 
 *********************************************************************/
/* 置1:RTOS使用搶占式調度器;置0:RTOS使用協作式調度器(時間片)
 * 
 * 注:在多任務管理機制上,作業系統可以分為搶占式和協作式兩種,
 * 協作式作業系統是任務主動釋放CPU后,切換到下一個任務,
 * 任務切換的時機完全取決于正在運行的任務,
 */
#define configUSE_PREEMPTION					  1

//1使能時間片調度(默認式使能的)
#define configUSE_TIME_SLICING					1		

/* 某些運行FreeRTOS的硬體有兩種方法選擇下一個要執行的任務:
 * 通用方法和特定于硬體的方法(以下簡稱“特殊方法”),
 * 
 * 通用方法:
 *      1.configUSE_PORT_OPTIMISED_TASK_SELECTION 為 0 或者硬體不支持這種特殊方法,
 *      2.可以用于所有FreeRTOS支持的硬體
 *      3.完全用C實作,效率略低于特殊方法,
 *      4.不強制要求限制最大可用優先級數目
 * 特殊方法:
 *      1.必須將configUSE_PORT_OPTIMISED_TASK_SELECTION設定為1,
 *      2.依賴一個或多個特定架構的匯編指令(一般是類似計算前導零[CLZ]指令),
 *      3.比通用方法更高效
 *      4.一般強制限定最大可用優先級數目為32
 * 一般是硬體計算前導零指令,如果所使用的,MCU沒有這些硬體指令的話此宏應該設定為0!
 */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION	        1                       
                                                                        
/* 置1:使能低功耗tickless模式;置0:保持系統節拍(tick)中斷一直運行
 * 假設開啟低功耗的話可能會導致下載出現問題,因為程式在睡眠中,可用以下辦法解決
 * 
 * 下載方法:
 *      1.將開發版正常連接好
 *      2.按住復位按鍵,點擊下載瞬間松開復位按鍵
 *     
 *      1.通過跳線帽將 BOOT 0 接高電平(3.3V)
 *      2.重新上電,下載
 *    
 * 			1.使用FlyMcu擦除一下芯片,然后進行下載
 *			STMISP -> 清除芯片(z)
 */
#define configUSE_TICKLESS_IDLE													0   

/*
 * 寫入實際的CPU內核時鐘頻率,也就是CPU指令執行頻率,通常稱為Fclk
 * Fclk為供給CPU內核的時鐘信號,我們所說的cpu主頻為 XX MHz,
 * 就是指的這個時鐘信號,相應的,1/Fclk即為cpu時鐘周期;
 */
#define configCPU_CLOCK_HZ						  (SystemCoreClock)

//RTOS系統節拍中斷的頻率,即一秒中斷的次數,每次中斷RTOS都會進行任務調度
#define configTICK_RATE_HZ						  (( TickType_t )1000)

//可使用的最大優先級
#define configMAX_PRIORITIES					  (32)

//空閑任務使用的堆疊大小
#define configMINIMAL_STACK_SIZE				((unsigned short)128)
  
//任務名字字串長度
#define configMAX_TASK_NAME_LEN					(16)

 //系統節拍計數器變數資料型別,1表示為16位無符號整形,0表示為32位無符號整形
#define configUSE_16_BIT_TICKS					0                      

//空閑任務放棄CPU使用權給其他同優先級的用戶任務
#define configIDLE_SHOULD_YIELD					1           

//啟用佇列
#define configUSE_QUEUE_SETS					  1    

//開啟任務通知功能,默認開啟
#define configUSE_TASK_NOTIFICATIONS    1   

//使用互斥信號量
#define configUSE_MUTEXES						    1    

//使用遞回互斥信號量                                            
#define configUSE_RECURSIVE_MUTEXES			1   

//為1時使用計數信號量
#define configUSE_COUNTING_SEMAPHORES		1

/* 設定可以注冊的信號量和訊息佇列個數 */
#define configQUEUE_REGISTRY_SIZE				10                                 
                                                                       
#define configUSE_APPLICATION_TASK_TAG		  0                       
                      

/*****************************************************************
              FreeRTOS與記憶體申請有關配置選項                                               
*****************************************************************/
//支持動態記憶體申請
#define configSUPPORT_DYNAMIC_ALLOCATION        1    
//支持靜態記憶體
#define configSUPPORT_STATIC_ALLOCATION					0					
//系統所有總的堆大小
#define configTOTAL_HEAP_SIZE					((size_t)(36*1024))    


/***************************************************************
             FreeRTOS與鉤子函式有關的配置選項                                            
**************************************************************/
/* 置1:使用空閑鉤子(Idle Hook類似于回呼函式);置0:忽略空閑鉤子
 * 
 * 空閑任務鉤子是一個函式,這個函式由用戶來實作,
 * FreeRTOS規定了函式的名字和引數:void vApplicationIdleHook(void ),
 * 這個函式在每個空閑任務周期都會被呼叫
 * 對于已經洗掉的RTOS任務,空閑任務可以釋放分配給它們的堆疊記憶體,
 * 因此必須保證空閑任務可以被CPU執行
 * 使用空閑鉤子函式設定CPU進入省電模式是很常見的
 * 不可以呼叫會引起空閑任務阻塞的API函式
 */
#define configUSE_IDLE_HOOK						0      

/* 置1:使用時間片鉤子(Tick Hook);置0:忽略時間片鉤子
 * 
 * 
 * 時間片鉤子是一個函式,這個函式由用戶來實作,
 * FreeRTOS規定了函式的名字和引數:void vApplicationTickHook(void )
 * 時間片中斷可以周期性的呼叫
 * 函式必須非常短小,不能大量使用堆疊,
 * 不能呼叫以”FromISR" 或 "FROM_ISR”結尾的API函式
 */
 /*xTaskIncrementTick函式是在xPortSysTickHandler中斷函式中被呼叫的,因此,vApplicationTickHook()函式執行的時間必須很短才行*/
#define configUSE_TICK_HOOK						0           

//使用記憶體申請失敗鉤子函式
#define configUSE_MALLOC_FAILED_HOOK			0 

/*
 * 大于0時啟用堆疊溢位檢測功能,如果使用此功能 
 * 用戶必須提供一個堆疊溢位鉤子函式,如果使用的話
 * 此值可以為1或者2,因為有兩種堆疊溢位檢測方法 */
#define configCHECK_FOR_STACK_OVERFLOW			0   


/********************************************************************
          FreeRTOS與運行時間和任務狀態收集有關的配置選項   
**********************************************************************/
//啟用運行時間統計功能
#define configGENERATE_RUN_TIME_STATS	        0             
 //啟用可視化跟蹤除錯
#define configUSE_TRACE_FACILITY				      0    
/* 與宏configUSE_TRACE_FACILITY同時為1時會編譯下面3個函式
 * prvWriteNameToBuffer()
 * vTaskList(),
 * vTaskGetRunTimeStats()
*/
#define configUSE_STATS_FORMATTING_FUNCTIONS	1                       
                                                                        
                                                                        
/********************************************************************
                FreeRTOS與協程有關的配置選項                                                
*********************************************************************/
//啟用協程,啟用協程以后必須添加檔案croutine.c
#define configUSE_CO_ROUTINES 			          0                 
//協程的有效優先級數目
#define configMAX_CO_ROUTINE_PRIORITIES       ( 2 )                   


/***********************************************************************
                FreeRTOS與軟體定時器有關的配置選項      
**********************************************************************/
 //啟用軟體定時器
#define configUSE_TIMERS				            1                              
//軟體定時器優先級
#define configTIMER_TASK_PRIORITY		        (configMAX_PRIORITIES-1)        
//軟體定時器佇列長度
#define configTIMER_QUEUE_LENGTH		        10                               
//軟體定時器任務堆疊大小
#define configTIMER_TASK_STACK_DEPTH	      (configMINIMAL_STACK_SIZE*2)    

/************************************************************
            FreeRTOS可選函式配置選項                                                     
************************************************************/
#define INCLUDE_xTaskGetSchedulerState       1                       
#define INCLUDE_vTaskPrioritySet		         1
#define INCLUDE_uxTaskPriorityGet		         1
#define INCLUDE_vTaskDelete				           1
#define INCLUDE_vTaskCleanUpResources	       1
#define INCLUDE_vTaskSuspend			           1
#define INCLUDE_vTaskDelayUntil			         1
#define INCLUDE_vTaskDelay				           1
#define INCLUDE_eTaskGetState			           1
#define INCLUDE_xTimerPendFunctionCall	     1
//#define INCLUDE_xTaskGetCurrentTaskHandle       1
//#define INCLUDE_uxTaskGetStackHighWaterMark     0
//#define INCLUDE_xTaskGetIdleTaskHandle          0


/******************************************************************
            FreeRTOS與中斷有關的配置選項                                                 
******************************************************************/
#ifdef __NVIC_PRIO_BITS
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4                  
#endif
//中斷最低優先級
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15     

//系統可管理的最高中斷優先級
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5 

#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )	/* 240 */

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )


/****************************************************************
            FreeRTOS與中斷服務函式有關的配置選項                         
****************************************************************/
#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler


/* 以下為使用Percepio Tracealyzer需要的東西,不需要時將 configUSE_TRACE_FACILITY 定義為 0 */
#if ( configUSE_TRACE_FACILITY == 1 )
#include "trcRecorder.h"
#define INCLUDE_xTaskGetCurrentTaskHandle               1   // 啟用一個可選函式(該函式被 Trace原始碼使用,默認該值為0 表示不用)
#endif


#endif /* FREERTOS_CONFIG_H */

修改stm32f10x_it.c

SysTick中斷服務函式是一個非常重要的函式,FreeRTOS所有跟時間相關的事情都在里面處理,SysTick就是FreeRTOS的一個心跳時鐘,驅動著FreeRTOS的運行,就像人的心跳一樣,假如沒有心跳,我們就相當于“死了”,同樣的,FreeRTOS沒有了心跳,那么它就會卡死在某個地方,不能進行任務調度,不能運行任何的東西,因此我們需要實作一個FreeRTOS的心跳時鐘,FreeRTOS幫我們實作了SysTick的啟動的配置:在port.c檔案中已經實作vPortSetupTimerInterrupt()函式,并且FreeRTOS通用的SysTick中斷服務函式也實作了:在port.c檔案中已經實作xPortSysTickHandler()函式,所以移植的時候只需要我們在stm32f10x_it.c檔案中實作我們對應(STM32)平臺上的SysTick_Handler()函式即可,FreeRTOS為開發者考慮得特別多,PendSV_Handler()與SVC_Handler()這兩個很重要的函式都幫我們實作了,在在port.c檔案中已經實作xPortPendSVHandler()與vPortSVCHandler()函式,防止我們自己實作不了,那么在stm32f10x_it.c中就需要我們注釋掉PendSV_Handler()與SVC_Handler()這兩個函式了,

//void SVC_Handler(void)
//{
//}

//void PendSV_Handler(void)
//{
//}

extern void xPortSysTickHandler(void);

//systick中斷服務函式
void SysTick_Handler(void)
{	
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif  /* INCLUDE_xTaskGetSchedulerState */
}

創建任務

這里,我們創建一個單任務,任務使用的堆疊和任務控制塊是在創建任務的時候FreeRTOS動態分配的,
任務必須是一個死回圈,否則任務將通過LR回傳,如果LR指向了非法的記憶體就會產生HardFault_Handler,而FreeRTOS指向一個死回圈,那么任務回傳之后就在死回圈中執行,這樣子的任務是不安全的,所以避免這種情況,任務一般都是死回圈并且無回傳值的,
并且每個任務回圈主體中應該有阻塞任務的函式,否則就會餓死比它優先級更低的任務!!!

/* FreeRTOS頭檔案 */
#include "FreeRTOS.h"
#include "task.h"
/* 開發板硬體bsp頭檔案 */
#include "bsp_led.h"

static void AppTaskCreate(void);/* AppTask任務 */

 /* 創建任務句柄 */
static TaskHandle_t AppTask_Handle = NULL;

int main(void)
{	
  BaseType_t xReturn = pdPASS;/* 定義一個創建資訊回傳值,默認為pdPASS */

  /* 開發板硬體初始化 */
  BSP_Init();

   /* 創建AppTaskCreate任務 */
  xReturn = xTaskCreate((TaskFunction_t )AppTask,  /* 任務入口函式 */
                        (const char*    )"AppTask",/* 任務名字 */
                        (uint16_t       )512,  /* 任務堆疊大小 */
                        (void*          )NULL,/* 任務入口函式引數 */
                        (UBaseType_t    )1, /* 任務的優先級 */
                        (TaskHandle_t*  )&AppTask_Handle);/* 任務控制塊指標 */ 
  /* 啟動任務調度 */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* 啟動任務,開啟調度 */
  else
    return -1;  
  
  while(1);   /* 正常不會執行到這里 */    
}

static void AppTask(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /* 延時500個tick */
        LED1_OFF;     
        vTaskDelay(500);   /* 延時500個tick */		 		
    }
}

關注我

歡迎關注我公眾號

更多資料歡迎關注“物聯網IoT開發”公眾號!

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/33414.html

標籤:嵌入式

上一篇:繼續學習freertos訊息佇列

下一篇:STM32之串口DMA接收不定長資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more