主頁 >  其他 > 【嵌入式】FreeRTOS的移植、任務運行狀態以及原始碼的優化改進

【嵌入式】FreeRTOS的移植、任務運行狀態以及原始碼的優化改進

2021-12-09 10:04:37 其他

目錄

    • 前言
    • 一、FreeRTOS移植的注意事項
    • 二、任務運行狀態的獲取
    • 三、任務運行狀態的原始碼優化

前言

FreeRTOS因其簡潔小巧、功能齊全而深受嵌入式領域歡迎,如下圖所示,除Linux外,FreeRTOS為全球嵌入式領域市場份額最多的實時作業系統,與之對標的uCOS、RTX、ThreadX等都被遠遠的甩在其后,加之近年又被亞馬遜收購,FreeRTOS的應用應該會進一步擴大,網上已有很多各實時作業系統的對比,我也使用過幾種作業系統包括FreeRTOS、uCOS等,但FreeRTOS給我的最深的印象就是移植方便,能夠針對不同芯片進行快速移植,并且該有的功能也都有了,

本文包含以下內容(本文不適用于初學者,默認讀者已有了良好的工程搭建基礎,以及良好的嵌入式代碼閱讀、撰寫能力):
1 對FreeRTOS移植程序中的重點做簡要說明;
2 講解開發階段需要用到的【任務運行狀態監視】該如何配置;
3 針對實際軟體穩定性對FreeRTOS的原始碼稍作修改,使得任務運行狀態可根據自己的需求隨意擴展,文中主要是在原始碼中增加了【任務切換次數】這個屬性,在任務發生切換時進行自加,并能通過FreeRTOS自帶的任務狀態獲取函式獲取,

一、FreeRTOS移植的注意事項

由于移植教程網上已有很多,而且基于KEIL、IAR的工程Demo也不在少數,故本文不對FreeRTOS的移植程序作詳細講解,只講大概步驟和主要的注意事項,
1.從【官網】下載原始碼后,將source目錄下的c檔案加入到工程中,將include目錄拷貝到工程目錄下,然后在source/portable目錄下找到適合自己MCU內核的介面檔案,并加入到工程中,
2.在Demo檔案夾中找到適合自己MCU的檔案夾,并將FreeRTOSConfig.h檔案拷貝到工程目錄下;
3.作業系統轉起來需要在滴答定時器中斷中定時運行調度函式、并依賴SVC例外處理函式獲取當前任務控制塊、依賴Pending中斷來進行背景關系切換,以上幾個中斷、例外時執行的函式都在source/portable目錄下的檔案port.c或portasm.s中給出,一般為匯編函式,FreeRTOS中分別如下命名:

xPortSysTickHandler
vPortSVCHandler
xPortPendSVHandler

而在啟動檔案的中斷向量表中,以上三個中斷、例外按如下命名:

SysTick_Handler  
SVC_Handler 
PendSV_Handler 

因此,當發生以上中斷、例外時,為了能順利呼叫FreeRTOS已經寫好的調度、切換函式,需要在FreeRTOSConfig.h中作如下宏定義:

#define vPortSVCHandler    SVC_Handler
#define xPortPendSVHandler PendSV_Handler

這樣一來,FreeRTOS原始碼中的vPortSVCHandler、xPortPendSVHandler函式就被替換成了中斷向量表中對應的中斷服務函式,從而在中斷發生時能進入FreeRTOS寫好的調度、任務切換函式,
到這里,有人會問,不還有個xPortSysTickHandler嗎,怎么沒有替換,原因是現在的嵌入式系統,無論裸機還是跑作業系統,一般都使能滴答定時器中斷,并在中斷中對一個變數進行自加操作,從而使這個變數成為整個系統的時間戳,因此,系統一初始化我就配置了周期為1ms的滴答定時器中斷,并在中斷函式中進行了時間戳的自加,這樣一來,只需要把xPortSysTickHandler函式放到滴答定時器的中斷處理函式中即可,如下所示:

volatile static uint32_t uwTick = 0;

void uwTickInc(void)
{
	uwTick++;
}

uint32_t sys_getTick(void)
{
	return uwTick;
}

void SysTick_Handler(void)
{
	uwTickInc();
	xPortSysTickHandler();
}

如此一來,擁有了滴答定時器驅動的調度函式、用于背景關系切換的Pending中斷函式,FreeRTOS就可以跑起來了,具體的任務創建、系統開啟等就不再贅述了,

二、任務運行狀態的獲取

開發階段需要在長期運行、測驗中發現并解決問題,因此獲取每個任務的運行狀態是很有必要的,好在FreeRTOS中也提供了這個功能,一般說來,系統的監視最好放在等級最高的任務中,這樣才能保證能監視所有任務,FreeRTOS中開啟任務運行狀態獲取主要分以下幾步:
1.在FreeRTOSConfig.h中添加宏定義:

#define configUSE_TRACE_FACILITY	1
#define configGENERATE_RUN_TIME_STATS 1

這樣一來,在空閑任務中就會統計各個任務運行的總耗時以及系統運行的總時長,既然說到時間統計了,那么定時器必不可少,在下一步中配置,
2.需要配置FreeRTOS給出的兩個宏定義:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define portGET_RUN_TIME_COUNTER_VALUE()

其中第一個是運行時間的定時器配置函式,第二個是定時器的時間戳獲取函式,由于我們已經配置了1ms的滴答定時器,并創建了一個永遠自加的時間戳變數,因此,這里的第一個宏定義可以直接為空,第二個宏定義配置為上文中的sys_getTick( )即可:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define portGET_RUN_TIME_COUNTER_VALUE()      sys_getTick( )

3.在監視任務中呼叫uxTaskGetSystemState進行各個任務狀態的獲取:

void watchTask(void *arg)
{
	TaskStatus_t task_state[N];
	uint32_t total_time;

	while(1)
	{
		vTaskDelay(pdMS_TO_TICKS(arg));
		uxTaskGetSystemState(task_state,N,&total_time);
	}

其中,函式的傳入引數void *arg為該任務的空轉時間,用于釋放cpu占用權供其他低優先級任務使用;N為你創建的任務總數(包括一個空閑任務),呼叫uxTaskGetSystemState后,就將所有任務的狀態拉取到task_state陣列中了,并將系統運行的總時長賦值給total_time,也就是滴答定時器中的時間戳,其中,TaskStatus_t 結構體元素如下所示,能夠展示任務句柄、名稱、序號、當前狀態等等:

/* Used with the uxTaskGetSystemState() function to return the state of each task
 * in the system. */
typedef struct xTASK_STATUS
{
    TaskHandle_t xHandle;                            /* The handle of the task to which the rest of the information in the structure relates. */
    const char * pcTaskName;                         /* A pointer to the task's name.  This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
    UBaseType_t xTaskNumber;                         /* A number unique to the task. */
    eTaskState eCurrentState;                        /* The state in which the task existed when the structure was populated. */
    UBaseType_t uxCurrentPriority;                   /* The priority at which the task was running (may be inherited) when the structure was populated. */
    UBaseType_t uxBasePriority;                      /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex.  Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */
    uint32_t ulRunTimeCounter;                       /* The total run time allocated to the task so far, as defined by the run time stats clock.  See https://www.FreeRTOS.org/rtos-run-time-stats.html.  Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */
    StackType_t * pxStackBase;                       /* Points to the lowest address of the task's stack area. */
    configSTACK_DEPTH_TYPE usStackHighWaterMark;     /* The minimum amount of stack space that has remained for the task since the task was created.  The closer this value is to zero the closer the task has come to overflowing its stack. */
} TaskStatus_t;

但有一點不好的是,uCOS中的TCB控制塊還有【任務切換次數】這個元素,而FreeRTOS的TCB控制塊中竟然沒有,而這個元素往往揭示了系統切換有無例外發生,在開發階段是一個重要資訊,有人會說,不是有個ulRunTimeCounter元素,能體現該任務的運行總用時嗎,這似乎可以替代切換次數吧?其實不然,因為任務運行時間的統計依賴于#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()定義的定時器的最小步長,通過對通過對ulRunTimeCounter統計原始碼的閱讀,發現如果定時器步長時間太長,如10ms,那么很有可能任務已經轉完一圈了,仍不能被統計到ulRunTimeCounter中,因為任務被切換時,由任務執行到任務釋放CPU所占用的時間如果還不足10ms,就不能夠被累加到ulRunTimeCounter,ulRunTimeCounter的統計原始碼部分如下所示:

#if ( configGENERATE_RUN_TIME_STATS == 1 )
            {
                #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
                    portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
                #else
                    ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
                #endif

                /* Add the amount of time the task has been running to the
                 * accumulated time so far.  The time the task started running was
                 * stored in ulTaskSwitchedInTime.  Note that there is no overflow
                 * protection here so count values are only valid until the timer
                 * overflows.  The guard against negative values is to protect
                 * against suspect run time stat counter implementations - which
                 * are provided by the application, not the kernel. */
                if( ulTotalRunTime > ulTaskSwitchedInTime )
                {
                    pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime );
                }
                else
                {
                    mtCOVERAGE_TEST_MARKER();
                }

                ulTaskSwitchedInTime = ulTotalRunTime;
            }
        #endif /* configGENERATE_RUN_TIME_STATS */

三、任務運行狀態的原始碼優化

為了解決運行狀態資訊中,不包含【任務切換次數】這個元素的問題,需要對原始碼進行修改,使得其支持這個功能,能讓我們直觀的查看某個任務被調度了多少次,具體的思路步驟為【任務控制塊中加入此元素】->【任務創建時初始化此元素】->【任務狀態結構體中加入此元素】->【任務切換時對此元素加1】->【獲取任務狀態時能回傳此元素】,按以下步驟進行原始碼修改:
1.在tasks.c中的typedef struct tskTaskControlBlock結構體中加入uint32_t switchTime元素,如下代碼所示:

typedef struct tskTaskControlBlock       /* The old naming convention is used to prevent breaking kernel aware debuggers. */
{
    volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */

    #if ( portUSING_MPU_WRAPPERS == 1 )
        xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer.  THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */
    #endif
	uint32_t switchTime;
    ListItem_t xStateListItem;                  /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */
    ListItem_t xEventListItem;                  /*< Used to reference a task from an event list. */
    UBaseType_t uxPriority;                     /*< The priority of the task.  0 is the lowest priority. */
    StackType_t * pxStack;                      /*< Points to the start of the stack. */
    char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created.  Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */

    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )
        StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */
    #endif

    #if ( portCRITICAL_NESTING_IN_TCB == 1 )
        UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */
    #endif

    #if ( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxTCBNumber;  /*< Stores a number that increments each time a TCB is created.  It allows debuggers to determine when a task has been deleted and then recreated. */
        UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */
    #endif

    #if ( configUSE_MUTEXES == 1 )
        UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */
        UBaseType_t uxMutexesHeld;
    #endif

    #if ( configUSE_APPLICATION_TASK_TAG == 1 )
        TaskHookFunction_t pxTaskTag;
    #endif

    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
        void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
    #endif

    #if ( configGENERATE_RUN_TIME_STATS == 1 )
        uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */
    #endif

    #if ( configUSE_NEWLIB_REENTRANT == 1 )

        /* Allocate a Newlib reent structure that is specific to this task.
         * Note Newlib support has been included by popular demand, but is not
         * used by the FreeRTOS maintainers themselves.  FreeRTOS is not
         * responsible for resulting newlib operation.  User must be familiar with
         * newlib and must provide system-wide implementations of the necessary
         * stubs. Be warned that (at the time of writing) the current newlib design
         * implements a system-wide malloc() that must be provided with locks.
         *
         * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html
         * for additional information. */
        struct  _reent xNewLib_reent;
    #endif

    #if ( configUSE_TASK_NOTIFICATIONS == 1 )
        volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
        volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
    #endif

    /* See the comments in FreeRTOS.h with the definition of
     * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */
    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
        uint8_t ucStaticallyAllocated;                     /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */
    #endif

    #if ( INCLUDE_xTaskAbortDelay == 1 )
        uint8_t ucDelayAborted;
    #endif

    #if ( configUSE_POSIX_ERRNO == 1 )
        int iTaskErrno;
    #endif
} tskTCB;

2.在tasks.c中的prvInitialiseNewTask任務初始化函式中加入switchTime的初始化,部分代碼如下所示:

/* This is used as an array index so must ensure it's not too large.  First
     * remove the privilege bit if one is present. */
    if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES )
    {
        uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;
    }
    else
    {
        mtCOVERAGE_TEST_MARKER();
    }

    pxNewTCB->uxPriority = uxPriority;
    pxNewTCB->switchTime = 0;
    #if ( configUSE_MUTEXES == 1 )
        {
            pxNewTCB->uxBasePriority = uxPriority;
            pxNewTCB->uxMutexesHeld = 0;
        }
    #endif /* configUSE_MUTEXES */

3.在task.h的TaskStatus_t結構體中加入uint32_t switchTime,代碼如下所示,因為需要呼叫uxTaskGetSystemState函式來獲得狀態資訊,其引數就是TaskStatus_t指標,

typedef struct xTASK_STATUS
{
    TaskHandle_t xHandle;                            /* The handle of the task to which the rest of the information in the structure relates. */
    const char * pcTaskName;                         /* A pointer to the task's name.  This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
    UBaseType_t xTaskNumber;                         /* A number unique to the task. */
    eTaskState eCurrentState;                        /* The state in which the task existed when the structure was populated. */
    UBaseType_t uxCurrentPriority;                   /* The priority at which the task was running (may be inherited) when the structure was populated. */
    UBaseType_t uxBasePriority;                      /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex.  Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */
    uint32_t ulRunTimeCounter;                       /* The total run time allocated to the task so far, as defined by the run time stats clock.  See https://www.FreeRTOS.org/rtos-run-time-stats.html.  Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */
    StackType_t * pxStackBase;                       /* Points to the lowest address of the task's stack area. */
    configSTACK_DEPTH_TYPE usStackHighWaterMark;     /* The minimum amount of stack space that has remained for the task since the task was created.  The closer this value is to zero the closer the task has come to overflowing its stack. */
	uint32_t switchTime;
} TaskStatus_t;

4.在任務背景關系切換的函式中對switchTime進行++操作,具體為:在tasks.c的vTaskSwitchContext函式中加入pxCurrentTCB->switchTime++,代碼如下所示:

void vTaskSwitchContext( void )
{
    if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )
    {
        /* The scheduler is currently suspended - do not allow a context
         * switch. */
        xYieldPending = pdTRUE;
    }
    else
    {
        xYieldPending = pdFALSE;
        pxCurrentTCB->switchTime++;
        traceTASK_SWITCHED_OUT();

        #if ( configGENERATE_RUN_TIME_STATS == 1 )
        .
        .
        .
        .
 }

5.通過閱讀原始碼得知,uxTaskGetSystemState函式真正獲得任務運行資訊是呼叫的vTaskGetInfo函式,因此在tasks.c的vTaskGetInfo函式中加入pxTaskStatus->switchTime = pxTCB->switchTime,代碼如下所示,這樣一來,呼叫uxTaskGetSystemState函式時,TCB中的switchTime元素就被賦值到TaskStatus_t指標中了,

#if ( configUSE_TRACE_FACILITY == 1 )

    void vTaskGetInfo( TaskHandle_t xTask,
                       TaskStatus_t * pxTaskStatus,
                       BaseType_t xGetFreeStackSpace,
                       eTaskState eState )
    {
        TCB_t * pxTCB;

        /* xTask is NULL then get the state of the calling task. */
        pxTCB = prvGetTCBFromHandle( xTask );

        pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB;
        pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName[ 0 ] );
        pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority;
        pxTaskStatus->pxStackBase = pxTCB->pxStack;
        pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber;
        pxTaskStatus->switchTime = pxTCB->switchTime;
        .
        .
        .
}

經過以上優化,在監視任務中就可以直接呼叫uxTaskGetSystemState來獲取到各個任務的切換次數,從而為監視任務增加了強有力的監管判斷條件,即某個任務一定時間內切換次數未變,則相應地做出什么處理,

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

標籤:其他

上一篇:【STM32】標準庫與HAL庫對照學習教程特別篇--IIC通信原理講解

下一篇:基于arduino的ESP32 學習筆記(一) 基于ESP32的智能花盆

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more