主頁 >  其他 > 基于STM32F767的UCOSIII移植學習

基于STM32F767的UCOSIII移植學習

2020-11-06 02:57:53 其他

(一)移植前的準備

1.HAL庫基本工程模板

新建一個工程模塊,其中包含LED驅動和串口驅動程式即可,用于驗證UCOS-III系統能夠正常作業,

2.UCOS-III原始碼準備

去Micrium官網下載最新的UCOSIII原始碼,下載地址:Micrium官網下載地址,沒有注冊過的用戶需要注冊一下,我自己注冊的程序都是淚,由于我選擇的是正點原子F7的開發板,所以在官網上選擇合適原始碼時就選擇F7的,具體版本選擇下圖中19年2月6號的版本:在這里插入圖片描述
下載完成之后發現,發現原始碼檔案夾中東西很多大部分都是和網路移植相關的,目前我們只移植最新版本的UCOSIII,所以這些檔案夾都不需要去看,進入原始碼目錄下的uCOS-III檔案夾,發現里面只有針對IAR的編譯器的檔案,難道MDK就涼涼了嗎?凡是先不要慌,雖然編譯器不同,但是實作的功能就是相同的,并不會影響到移植后作業系統的運行,

UCOSIII的移植

(一)原始碼檔案的摘選

1.在準備好的工程檔案夾下新建一個UCOS-III目錄,用于存放和UCOSIII相關的所有代碼,在UCOS-III目錄下新建如下目錄,用于UCOS原始碼的分類,在這里插入圖片描述
(1)將原始碼目錄Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-CPU下的檔案全部拷貝到我們創建的uC-CPU目錄下,為了減少檔案夾的個數,我把ARM-Cortex-M\ARMv7-M目錄下和ARM-Cortex-M\ARMv7-M\ARM目錄下的檔案都移到了自己創建的uC-CPU目錄下了,這里我要說明下一下IAR和ARM目錄下的檔案,除了匯編檔案有些不同以外,頭檔案內容都是相同的,這邊選擇ARM目錄下的匯編檔案還是IAR目錄下的匯編檔案都行,因為我們都是要修改成MDK支持的形式的,
(2)將原始碼目錄Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-LIB檔案夾下的檔案全部拷貝到自己創建的uC-LIB目錄下,這邊我直接把Micrium\Software\uC-LIB\Ports\ARM-Cortex-M4\RealView目錄下的檔案和其他檔案放在了一個檔案夾下,具體如下圖所示:在這里插入圖片描述
由于我們使用的是MDK編譯,所以這邊選擇的是RealView目錄下的匯編檔案,具體什么原因的話,網上有很多解釋,我就不復制他們的解釋了,
(3)將Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uCOS-III目錄下的檔案全部拷貝到自己創建uCOS-III目錄下,點開Ports的目錄,發現最后只有一個IAR檔案下,這邊我們先不用關注,只需將檔案都拷貝過來,具體內容如下圖所示:在這里插入圖片描述
在這里插入圖片描述
(4)將原始碼例程目錄Micrium_STM32F746G-DISCO_Crypto\ST\STM32F746G_Disco\Crypto下的部分檔案和OS3下的部分檔案拷貝到自己創建的UCOS-CONFIG檔案夾下,具體檔案如下圖所示:在這里插入圖片描述
在原始碼例程檔案中,發現很多都是網路相關的移植代碼,所以沒有拷貝過來,但是有一個clk_cfg.h很明顯不是和網路相關的,為什么不移植過來呢?從名字上看就是和時鐘相關的,難道說不需要時鐘配置嗎?時鐘當然是需要配置的,但是裸機工程中時鐘已經配置OK了,這邊和時鐘相關的檔案也就不需要了,后面作業系統的時鐘需要自己通過HAL庫配置,這邊就不詳細說明了,
(5)將Micrium_STM32F746G-DISCO_Crypto\ST\BSP\STM32F746G_Disco目錄下的bsp_cpu.c檔案拷貝到自己創建的UCOS-BSP目錄下,并且新建一個bsp_cpu.h頭檔案(用于包含作業系統的頭檔案),其他檔案都不需要拷貝,大多是和芯片外設相關的初始化,

(二)檔案添加

(1)打開MDK工程,將拷貝的檔案添加至工程當中,具體內容如下圖所示:在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
以及頭檔案路徑添加,如下圖所示:在這里插入圖片描述
上述檔案都添加完成之后,點擊編譯,提示下圖錯誤:在這里插入圖片描述
出現unknown opcode什么的錯誤,而且出現在os_cpu_a.asm檔案中,那就打開這個匯編檔案看一下,是什么問題,發現PUBLIC關鍵字都沒有標藍,那肯定是由于這個關鍵字不是MDK的關鍵字,所以講PUBLIC修改為MDK所用的關鍵字EXPORT,具體EXPORT這個關鍵字怎么來的,我是查看了其他版本的UCOS在STM32的移植,看到用的是這個關鍵字,就直接抄過來了,還有錯誤與FPU相關,如下圖所示:

#ifdef __ARMVFP__
    EXPORT  OS_CPU_FP_Reg_Push
    EXPORT  OS_CPU_FP_Reg_Pop
#endif

查看了正點原子的移植手冊,發現上面說到

Cortex-M7內核中有個Lazy Stacking的功能,如果使用FPU功能的話就需要關閉這個功能,需要修改startup_stm32f767xx.s匯編檔案,在里面關閉這個功能,

具體代碼如下所示:

 IF {FPU} != "SoftVFP"
                                        ; Enable Floating Point Support at reset for FPU
		LDR.W   R0, =0xE000ED88         ; Load address of CPACR register
		LDR     R1, [R0]                ; Read value at CPACR
    	ORR     R1,  R1, #(0xF <<20)    ; Set bits 20-23 to enable CP10 and CP11 coprocessors
                                        ; Write back the modified CPACR value
	    STR     R1, [R0]                ; Wait for store to complete
        DSB
                
	                                    ; Disable automatic FP register content
                                        ; Disable lazy context switch
      	LDR.W   R0, =0xE000EF34         ; Load address to FPCCR register
       	LDR     R1, [R0]
   		AND     R1,  R1, #(0x3FFFFFFF)  ; Clear the LSPEN and ASPEN bits
   		STR     R1, [R0]
     	ISB                             ; Reset pipeline now the FPU is enabled
     	ENDIF

在startup_stm32f767xx.s中就如下圖所示:在這里插入圖片描述
修改完這些,接下去就解決… error: A1163E: Unknown opcode ARMVFP , expecting opcode or Macro 這個錯誤,將原先的判斷陳述句修改為如下陳述句:

	IF {FPU} != "SoftVFP"
    EXPORT  OS_CPU_FP_Reg_Push
    EXPORT  OS_CPU_FP_Reg_Pop
	ENDIF
	IF {FPU} != "SoftVFP"
OS_CPU_FP_Reg_Push
    MRS     R1, PSP                                             ; PSP is process stack pointer
    CBZ     R1, OS_CPU_FP_nosave                                ; Skip FP register save the first time

    VSTMDB  R0!, {S16-S31}
    LDR     R1, =OSTCBCurPtr
    LDR     R2, [R1]
    STR     R0, [R2]
OS_CPU_FP_nosave
    BX      LR
	ENDIF
	IF {FPU} != "SoftVFP"
OS_CPU_FP_Reg_Pop
    VLDMIA  R0!, {S16-S31}
    LDR     R1, =OSTCBHighRdyPtr
    LDR     R2, [R1]
    STR     R0, [R2]
    BX      LR
	ENDIF

修改完成之后,再次編譯,依舊存在 error: A1163E: Unknown opcode RSEG , expecting opcode or Macro 的錯誤,這主要是由于編譯器關鍵字的問題,所以這里直接借鑒其他其他版本在MDK上的移植,具體修改代碼如下:

    PRESERVE8
    THUMB

    AREA CODE, CODE, READONLY

再次編譯,發現這個匯編檔案中還有一個警告: warning: A1581W: Added 2 bytes of padding at address 0x112,這是提示地址沒對齊,那就在末尾添加一個對齊指令,具體代碼如下:

OS_CPU_PendSVHandler
    CPSID   I                                                   ; Cortex-M7 errata notice. See Note #5
    MOV32   R2, OS_KA_BASEPRI_Boundary                          ; Set BASEPRI priority level required for exception preemption
    LDR     R1, [R2]
    MSR     BASEPRI, R1
    DSB
    ISB
    CPSIE   I

    MRS     R0, PSP                                             ; PSP is process stack pointer
    STMFD   R0!, {R4-R11, R14}                                  ; Save remaining regs r4-11, R14 on process stack

    MOV32   R5, OSTCBCurPtr                                     ; OSTCBCurPtr->StkPtr = SP;
    LDR     R1, [R5]
    STR     R0, [R1]                                            ; R0 is SP of process being switched out

                                                                ; At this point, entire context of process has been saved
    MOV     R4, LR                                              ; Save LR exc_return value
    BL      OSTaskSwHook                                        ; Call OSTaskSwHook() for FPU Push & Pop

    MOV32   R0, OSPrioCur                                       ; OSPrioCur   = OSPrioHighRdy;
    MOV32   R1, OSPrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]

    MOV32   R1, OSTCBHighRdyPtr                                 ; OSTCBCurPtr = OSTCBHighRdyPtr;
    LDR     R2, [R1]
    STR     R2, [R5]

    ORR     LR,  R4, #0x04                                      ; Ensure exception return uses process stack
    LDR     R0,  [R2]                                           ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;
    LDMFD   R0!, {R4-R11, R14}                                  ; Restore r4-11, R14 from new process stack
    MSR     PSP, R0                                             ; Load PSP with new process SP

    MOV32   R2, #0                                              ; Restore BASEPRI priority level to 0
    MSR     BASEPRI, R2
    BX      LR                                                  ; Exception return will restore remaining context

	ALIGN

    END

再次編譯,os_cpu_a.asm檔案內沒有錯誤,還有兩個小錯誤:
在這里插入圖片描述
將os_cpu_c.c中os.h的頭檔案路徑修改意見,將bsp_cpu.c中的bsp_clk.h頭檔案注釋掉,再次編譯,報錯資訊如下圖:
在這里插入圖片描述
發現報錯資訊都在bsp_cpu.c當中,而且都是和時鐘頻率相關的,打開原始碼例程中的bsp_clk.c檔案,查看BSP_ClkFreqGet()函式,發現里面呼叫的函式不就是HAL庫提供的嗎,那我們直接將bsp_cpu.c中的時鐘獲取函式修改為HAL庫提供的函式,不就OK了嗎,修改后的代碼如下所示:

#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{
    CPU_INT32U  fclk_freq;
    CPU_INT32U  reg_val;

                                                                /* ---- DWT WRITE ACCESS UNLOCK (CORTEX-M7 ONLY!!) ---- */
    reg_val = CPU_BSP_REG_DWT_LSR;                              /* Read lock status register.                           */
    if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLI) != 0) {             /* Check if Software lock control mechanism exits       */
        if ((reg_val & CPU_BSP_BIT_DWT_LSR_SLK) != 0) {         /* Check if DWT access needs to be unlocked             */
            CPU_BSP_REG_DWT_LAR = CPU_BSP_DWT_LAR_KEY;          /* Unlock DWT write access.                             */
        }
    }

    fclk_freq =  HAL_RCC_GetHCLKFreq();

    CPU_BSP_REG_DEMCR  |= DEF_BIT_24;                           /* Set DEM_CR_TRCENA                                    */
    CPU_BSP_REG_DWT_CR |= DEF_BIT_00;                           /* Set DWT_CR_CYCCNTENA                                 */

    CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
}
#endif
#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS32_to_uSec (CPU_TS32  ts_cnts)
{
    CPU_INT64U  ts_us;
    CPU_INT64U  fclk_freq;


    fclk_freq =  HAL_RCC_GetHCLKFreq();
    ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

    return (ts_us);
}
#endif


#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS64_to_uSec (CPU_TS64  ts_cnts)
{
    CPU_INT64U  ts_us;
    CPU_INT64U  fclk_freq;


    fclk_freq = HAL_RCC_GetHCLKFreq();
    ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

    return (ts_us);
}
#endif

修改完之后,再次編譯,發現了很多重復定義的錯誤,都適合__dbg_ucos-iii.c檔案相關,那就直接移除掉這個檔案,再編譯看看結果如何,
編譯之后發現只有一個未定義的錯誤,打開os_cpu.h頭檔案,發現了下面這行代碼:

#define  OS_TASK_SW_SYNC()          __ISB()

明明定義了,卻還是提示未定義的錯誤,那我搜索了一下__ISB()函式,在cmsis_armcc.h中明確定義了,難道沒添加頭檔案引起的嗎,那就添加頭檔案再編譯一下,報錯資訊更多了,那很明顯不是這個問題了,看到cmsis_armcc.h中有這一行代碼:

#define __ISB() do {\
                   __schedule_barrier();\
                   __isb(0xF);\
                   __schedule_barrier();\
                } while (0U)

那就直接修改成

#define  OS_TASK_SW_SYNC()          __isb(0xF)

這樣編譯倒是沒問題了,但是系統運行起來有沒有問題就不知道,先這么做吧,這個頭檔案中還有一行代碼也需要修改:

#ifdef	__ARMVFP__	
#define  OS_CPU_ARM_FP_EN              1u
#else
#define  OS_CPU_ARM_FP_EN              0u
#endif

修改為

#ifdef __TARGET_FPU_SOFTVFP
#define  OS_CPU_ARM_FP_EN              1u
#else
#define  OS_CPU_ARM_FP_EN              0u
#endif

編譯后無錯誤,現在這系統能夠正常運行起來了嗎?講實話我也不太清楚,那就測驗一下吧,

(三)測驗系統

拷貝如下代碼至main.c中,

#include  <stdio.h>
#include  <string.h>
#include  <ctype.h>
#include  <stdlib.h>
#include  <stdarg.h>
#include  <math.h>

#include  <os.h>

#include  <cpu.h>
#include  <lib_def.h>
#include  <lib_ascii.h>
#include  <lib_math.h>
#include  <lib_mem.h>
#include  <lib_str.h>

#include  <app_cfg.h>
#include  "bsp_cpu.h"

//任務優先級
#define START_TASK_PRIO		2
//任務堆疊大小	
#define START_STK_SIZE 		512
//任務控制塊
OS_TCB StartTaskTCB;
//任務堆疊	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務函式
void start_task(void *p_arg);

//任務優先級
#define LED0_TASK_PRIO		3
//任務堆疊大小	
#define LED0_STK_SIZE 		128
//任務控制塊
OS_TCB Led0TaskTCB;
//任務堆疊	
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);

//任務優先級
#define LED1_TASK_PRIO		4
//任務堆疊大小	
#define LED1_STK_SIZE       128
//任務控制塊
OS_TCB Led1TaskTCB;
//任務堆疊	
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//任務函式
void led1_task(void *p_arg);

//任務優先級
#define FLOAT_TASK_PRIO		5
//任務堆疊大小
#define FLOAT_STK_SIZE		256
//任務控制塊
OS_TCB	FloatTaskTCB;
//任務堆疊
CPU_STK	FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任務函式
void float_task(void *p_arg);

/*****************************************************************************************************************************************
 * Function Name: main
 * Input:         None
 * Output:        None
 * Returns:       None
 * Description:   主函式
 * Note:          None
*****************************************************************************************************************************************/
int main(void)
{
	OS_ERR err;
	CPU_SR_ALLOC();
	
	HW_Init();
	MT_Init();
	
	OSInit(&err);		            //初始化UCOSIII
	CPU_CRITICAL_ENTER();            //進入臨界區
	//創建開始任務
	OSTaskCreate((OS_TCB 	* )&StartTaskTCB,		//任務控制塊
				 (CPU_CHAR	* )"start task", 		//任務名字
                 (OS_TASK_PTR )start_task, 			//任務函式
                 (void		* )0,					//傳遞給任務函式的引數
                 (OS_PRIO	  )START_TASK_PRIO,     //任務優先級
                 (CPU_STK   * )&START_TASK_STK[0],	//任務堆疊基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,	//任務堆疊深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,		//任務堆疊大小
                 (OS_MSG_QTY  )0,					//任務內部訊息佇列能夠接收的最大訊息數目,為0時禁止接收訊息
                 (OS_TICK	  )0,					//當使能時間片輪轉時的時間片長度,為0時為默認長度,
                 (void   	* )0,					//用戶補充的存盤區
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, //任務選項,為了保險起見,所有任務都保存浮點暫存器的值
                 (OS_ERR 	* )&err);				//存放該函式錯誤時的回傳值
	CPU_CRITICAL_EXIT();	//退出臨界區	 
	OSStart(&err);      //開啟UCOSIII
	
	while(1)
	{
		
		
	}
}
//開始任務函式
void start_task(void *p_arg)
{
	OS_ERR err;
	CPU_SR_ALLOC();
	p_arg = p_arg;

	CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);  	//統計任務                
#endif
	
#ifdef CPU_CFG_INT_DIS_MEAS_EN		//如果使能了測量中斷關閉時間
    CPU_IntDisMeasMaxCurReset();	
#endif

#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //當使用時間片輪轉的時候
	 //使能時間片輪轉調度功能,設定默認的時間片長度s
	OSSchedRoundRobinCfg(DEF_ENABLED,10,&err);  
#endif		
	
	CPU_CRITICAL_ENTER();	//進入臨界區
	//創建LED0任務
	OSTaskCreate((OS_TCB 	* )&Led0TaskTCB,		
				 (CPU_CHAR	* )"led0 task", 		
                 (OS_TASK_PTR )led0_task, 			
                 (void		* )0,					
                 (OS_PRIO	  )LED0_TASK_PRIO,     
                 (CPU_STK   * )&LED0_TASK_STK[0],	
                 (CPU_STK_SIZE)LED0_STK_SIZE/10,	
                 (CPU_STK_SIZE)LED0_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,					
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
                 (OS_ERR 	* )&err);				
				 
	//創建LED1任務
	OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		
				 (CPU_CHAR	* )"led1 task", 		
                 (OS_TASK_PTR )led1_task, 			
                 (void		* )0,					
                 (OS_PRIO	  )LED1_TASK_PRIO,     	
                 (CPU_STK   * )&LED1_TASK_STK[0],	
                 (CPU_STK_SIZE)LED1_STK_SIZE/10,	
                 (CPU_STK_SIZE)LED1_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,				
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, 
                 (OS_ERR 	* )&err);
				 
	//創建浮點測驗任務
	OSTaskCreate((OS_TCB 	* )&FloatTaskTCB,		
				 (CPU_CHAR	* )"float test task", 		
                 (OS_TASK_PTR )float_task, 			
                 (void		* )0,					
                 (OS_PRIO	  )FLOAT_TASK_PRIO,     	
                 (CPU_STK   * )&FLOAT_TASK_STK[0],	
                 (CPU_STK_SIZE)FLOAT_STK_SIZE/10,	
                 (CPU_STK_SIZE)FLOAT_STK_SIZE,		
                 (OS_MSG_QTY  )0,					
                 (OS_TICK	  )0,					
                 (void   	* )0,				
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, 
                 (OS_ERR 	* )&err);
				 
	CPU_CRITICAL_EXIT();	//進入臨界區				 
	OSTaskSuspend((OS_TCB*)&StartTaskTCB,&err);		//掛起開始任務			 
}

//led0任務函式
void led0_task(void *p_arg)
{
	OS_ERR err;
	p_arg = p_arg;
	while(1)
	{
		HW_Led0_On();    //LED0打開
		OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延時200ms
		HW_Led0_Off();    //LED0關閉
		OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時500ms
	}
}

//led1任務函式
void led1_task(void *p_arg)
{
	OS_ERR err;
	p_arg = p_arg;
	
	while(1)
	{
		HW_Led1_On();
        HW_Delay_ms(500);//延時500ms
		HW_Led1_Off();
		HW_Delay_ms(500);
		OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); 
	}
}

//浮點測驗任務
void float_task(void *p_arg)
{
	OS_ERR err;
	
	CPU_SR_ALLOC();
	static double double_num=0.00;
	while(1)
	{
		double_num+=0.01f;
		CPU_CRITICAL_ENTER();	//進入臨界區
		printf("double_num的值為: %.4f\r\n",double_num);
		CPU_CRITICAL_EXIT();		//退出臨界區
		OSTimeDlyHMSM(0,0,0,20,OS_OPT_TIME_HMSM_STRICT,&err);
	}
}

編譯后,燒寫進開發板,查看現象:LED燈沒亮;那系統肯定沒有運行起來,通過Debug看看哪里出問題了,結果發現程式停在了如下地方:
在這里插入圖片描述
那說明是PendSV中斷處理出了問題,看看整個工程中哪里需要調整,os_cpu_a.asm匯編檔案中定義了OS_CPU_PendSVHandler函式,這是Micrium官方移植例程中修改了PendSV中斷函式的名稱,所以這邊需要修改回來,然后再編譯報該函式的重定義錯誤,在這里插入圖片描述
這邊屏蔽掉stm32f7xx_it.c中的PendSV_Handler函式定義,再次編譯;沒有報錯,那就再下載驗證一下,結果還是失敗了,那就再Debug一下,看看是哪里的問題,發現程式運行之后,開始任務調度之后就掛在空閑任務上,找來找去沒發現什么問題,本來都準備放棄了,后來看到作業系統的時間都是通過滴答定時器中斷產生的,然后仔細看了一下代碼,雖然使用了滴答定時器,但是沒有使用中斷,那趕緊加上試試,順便將stm32f7xx_it.h中定義的滴答定時器中斷函式屏蔽掉,編譯之后沒報錯,那就在測驗一下,終于,LED燈如愿的閃爍起來 ,串口也正常作業起來了,說明作業系統真正運行起來了,在這里插入圖片描述
下面附上移植后的工程,
鏈接:https://pan.baidu.com/s/1AGw1SWNMI_BpX7NLsxvQdg
提取碼:bzne
復制這段內容后打開百度網盤手機App,操作更方便哦

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

標籤:其他

上一篇:在python3編譯一下代碼,總是執行不了,請幫忙看看是什么原因?謝謝。

下一篇:密碼學中的各類密碼匯總(二)

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