Keil編譯警告:function "assert_param" declared implicitly的...

2021-01-11 電子工程世界

1 問題描述

新建STM32的keil工程,在編譯時出現警告「..FWLIBsrcstm32f10x_rcc.c(273): warning: #223-D: function 「assert_param」 declared implicitly」,接下來一堆警告和錯誤。

 

出錯的原因:函數「assert_param」未聲明。assert_param


2 問題分析

函數assert_param是STM32官方庫文件中用到的。


對於我採用的《STM32F10x_StdPeriph_Lib_V3.5.0》庫文件來說,assert_param函數在文件「stm32f10x_conf.h」的第59-73行。

查看函數說明可知,assert_param是一個條件表達式宏定義,主要作用是對函數的輸入參數進行檢查。仔細查看程序段,不管是否定義USE_FULL_ASSERT,函數assert_param均有定義,編譯時不應該出現上述警告。


還有一種可能,那就是雖然定義了函數assert_param,但是包含定義的文件「stm32f10x_conf.h」沒有被編譯。


在工程文件中搜索字符「stm32f10x_conf.h」,在文件「stm32f10x.h」的第8301-8303行找到程序段。

這段代碼的意思:如果定義USE_STDPERIPH_DRIVER,則包含文件「stm32f10x_conf.h」。同樣的,如果沒定義則不包含。


在工程中搜索文本USE_STDPERIPH_DRIVER,沒有找到有關 USE_STDPERIPH_DRIVER的宏定義,因此也就沒有包含stm32f10x_conf.h文件,工程中也就沒有assert_param的聲明。


文本「USE_STDPERIPH_DRIVER」的字面意思:使用標準外設驅動。也就是說如果需要使用ST官方提供的外設驅動庫則需要定義「USE_STDPERIPH_DRIVER」。


很明顯問題出在使用了官方的標準外設庫又沒有定義「USE_STDPERIPH_DRIVER」。


3 問題解決

解決問題的辦法就是在工程中定義「USE_STDPERIPH_DRIVER」。這有兩種方法。


方法一:標準宏定義


在工程中定義USE_STDPERIPH_DRIVER。通過上面的分析,在「stm32f10x.h」文件的起始位置定義USE_STDPERIPH_DRIVER即可。


先修改「stm32f10x.h」的只讀屬性。在工程文件中找到文件後,把文件屬性修改為可讀寫的。


然後在Keil打開「stm32f10x.h」文件,在文件頭添加代碼「#define USE_STDPERIPH_DRIVER」。

重新編譯工程,問題解決。


方法二:工程參數設置


在Keil工程中,點擊「options for Target…」,在彈出窗口中點擊「C/C++」,在「Preprocessor Symbols」的「Define」欄輸入「USE_STDPERIPH_DRIVER」。


Preprocessor Symbols 就是預處理符號,輸入「USE_STDPERIPH_DRIVER」就是向工程中添加預處理標號「USE_STDPERIPH_DRIVER」,等同於在代碼中添加宏定義「#define USE_STDPERIPH_DRIVER」。 


設置完後,編譯工程,問題解決。

關鍵字:Keil  編譯警告  解決方法 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/ic475508.html

推薦閱讀

詳解keil4怎樣新建一個工程且新建文件

學習單片機要用到keil等的代碼編譯軟體,初學者需要從第一步新建工程走起,做好第一步,才能越走越遠。工具/原料電腦,keil軟體方法/步驟打開keil軟體,找到project,下拉菜單有一項new uvision project。點擊這個項目,會出現一個項目路逕自定義項目名稱和保存位置。選擇需要燒代碼的單片機晶片的生產公司以及相應的晶片型號上一步做好以後,出現一個提示,點是就會生成一個51的啟動文件,否就不會出現,如圖,是點了是以上步驟就新建了一個工程。我們可以直接add進去已有的文件。本次介紹如何自己新建文件。點標題欄的新建按鈕,出現了一個隨機的text1,點擊保存按鈕,會提出下圖的對話框。如果是C語言就在文件名後加上.c

發表於 2021-01-10

51單片機Keil C51的使用(C語言)

實驗目的:初步掌握Keil(C51語言)和SUN ES59PA實驗儀的操作和使用,能夠輸入和運行簡單的程序。實驗設備:SUN ES59PA實驗儀一套、具有一個RS232串行口並安裝Keil C51的計算機一臺。實驗原理及環境:1.在計算機上已安裝Keil C51軟體。這個軟體既可以與硬體(SUN ES59PA實驗儀)連接,在硬體(單片機)上運行程序;也可以不與硬體連接,僅在計算機上以虛擬仿真的方法運行程序。如果程序有對硬體的驅動,就需要與硬體連接;如果沒有硬體動作,僅有軟體操作,就可以使用虛擬仿真。2. 實驗的硬體環境:A3區:CPU總線、I/O接口 片選區JP37,JP45:地址線A0..A7;JP48、JP50:CPU的D0

發表於 2020-11-25

keil編譯中所有編譯的錯誤信息

1."c" not an argument in function sum 該標識符不是函數的參數  2.array bounds missing ] in function main 缺少數組界限符 "]"  3.Array size too large in function main 數組規模太大  4.bad file name format in include directive 在包含指令中的文件名格式不正確.  5.Call of non-function in function main 調用未經

發表於 2020-10-15

在Keil4中建立基於V3.4.0固件庫的STM32工程

;Keil版本: μVision 4.1.0       STM32固件庫版本: V3.4.0     第一步,建立工程文件夾,在其子文件夾內拷貝並整理好相應的文件。        1.1、建立工程文件夾,將它命名為"SysTick"。        1.2、在"SysTick"下分別建立"Lib

發表於 2020-10-15

51單片機keil提供的啟動代碼解析(STARTUP.A51)

1.由Keil C生成的啟動代碼程序清單1.1 AT89C51啟動代碼$NOMOD51    //不使用51默認的特殊功能寄存器;---; This file is part of the C51 Compiler package; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc

發表於 2020-09-23

keil中for循環變量遞減,無法跳出循環的問題

定義j時應注意其變量類型char,此循環當j=0時,再執行一次則keil中j=0XFF,而不是-1,所以無法跳出循環。但在vc6.0中是可以跳出循環的。解決辦法如下:不能讓j的值為負數uchar j;

發表於 2020-09-21

相關焦點

  • KeilMDK 編譯警告Warning: L6304W: Duplicate input file
    XX declared implicitly warning: #223-D: function "CLR_TX_DATA" declared implicitly解決方法。STM32工程警告:warning: #223-D 建立工程,編譯大量報錯和警告:..
  • STM32 中的 assert_param 函數
    4 斷言機制函數assert_param我們在分析庫函數的時候,幾乎每一個函數的原型有這個函數assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));為例說一下我的理解,函數的參數IS_GPIO_ALL_PERIPH(GPIOx),我們可以尋找到原型#define IS_GPIO_ALL_PERIPH(PERIPH)
  • 如何使用assert_param
    在STM32的固件庫和提供的例程中,到處都可以見到assert_param()的使用。如果打開任何一個例程中的stm32f10x_conf.h文件,就可以看到實際上assert_param是一個宏定義;在固件庫中,它的作用就是檢測傳遞給函數的參數是否是有效的參數。
  • Keil C51中靜態庫的生成與使用
    編譯中所有編譯的錯誤信息 1."c" not an argument in function sum 該標識符不是函數的參數  2.array bounds missing ] in function main 缺少數組界限符 "]"  3.Array size too large in function main 數組規模太大  4.bad file name format in include directive 在包含指令中的文件名格式不正確
  • STM32+Keil 中使用printf函數
    PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ *//* Private functions --*//*** @brief Main program* @param
  • KEIL4 工程到 KEIL5 程序的移植方法
    此文件在Keil4.7裡沒有,需要在網上下載一份,然後放 發表於 2020-06-13 keil4.74中運行s3c2440程序出現警告 進行一步驟修改 安裝提示 一步一步的修改 解析 警告  warning: A1608W:
  • 一篇詳細的KEIL C51 UV2使用教程
    選擇它(或按F7)編譯你的程序,在改正程序中的所有錯誤後,debug start/stop debug session菜單和相應的按鈕就可用了,選擇它就可以開始調試了。等的代碼編譯軟體,初學者需要從第一步新建工程走起,做好第一步,才能越走越遠。
  • C語言陷阱與技巧20節,自定義「編譯時」assert方法,在代碼編譯階段...
    ); assert(fd > 0);printf("fd = %d\n", fd);return0; }編譯上述C語言代碼並執行,得到如下輸出:# gcc t.c# ./a.out fd = -1編譯時 assert可以看出,assert() 用於處理C語言程序可能出現諸多預期之外的「意外」時很有用,它能夠自己輸出究竟哪一個「意外」發生。但是 assert() 也是死板的,它在遇到假條件時直接把程序終止,剩餘的代碼邏輯不再有機會執行。
  • 在Eclipse下編譯Keil MDK工程
    設置"cts.ini"文件中的編譯選項確實不是一般人能搞定. 我也不懂(誰懂的做個說明分享下吧, 可以的話還能集成為UI, 更方便). 因為人懶, 不想去深究這些編譯(連結)器選項, 於是想到了個折中的辦法: 通過Keil uVision來設置好這些參數並編譯工程, 然後把它實時的編譯選項顯示出來以供參考!
  • 異常處理和報錯:assert特殊炫技處理
    的變量SyntaxError Python代碼非法,代碼不能編譯(x, y): assert isinstance(x, (float, int)) and isinstance(y, (float, int)), \ "param `x` and `y` expected to be 'int' or 'float' type" assert y !
  • keil c51編譯器對內存分配一些使用心得
    內存分配的基本原理:keil與其他的c語言編譯器我認為從內存分配的原理上是基本相同的。b(){unsigned char byte_b1;unsigned char byte_b2;unsigned char byte_b3;byte_b1 = byte_b2 = byte_b3 = 3;return;}兩段程序的作用是相同的,都是先執行函數a,然後根據byte_a1的值判斷去執行b程序,但是用keil編譯的結果卻不相同
  • 解決:keil報錯invalid redeclaration of type name 「s32「
    在ST官網上下的固件包,用STM32F10x_StdPeriph_Lib_V3.4.0/Project/STM32F10x_StdPeriph_Template裡的工程,編譯正確。
  • 【單片機筆記】keil c51編譯環境不能跳轉函數的解決辦法
    keil c51 不能使用:Go to Definition of....的解決方法最近使用keil c51 開發usb固件,當向vc一樣使用Go to Definition of....時,出現警告對話框:no browse information available in'工程目錄'check
  • 單片機keil 常見問題
    一、混合編程1、模塊內接口:使用如下標誌符:#pragma asm彙編語句#pragma endasm注意:如果在c51程序中使用了彙編語言,注意在keil
  • 簡析單片機keil常見問題
    一、混合編程  1、模塊內接口:  使用如下標誌符:  #pragma asm  彙編語句  #pragma endasm  注意:如果在c51程序中使用了彙編語言,注意在keil編譯器中需要激活Properties中的「
  • KEIL環境下如何讓代碼在 RAM中運行
    編譯時,編譯器會自動將這些函數放到RAMCODE所在0x20000000開始的區域。{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); /* Insert a 100ms delay */HAL_Delay(100);}void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){ /* Check the parameters */assert_param
  • 自學單片機第三篇:keil軟體
    我之前裝的是keil4,現在網絡上是keil5,圖標變成綠色,4改成5。圖標雙擊打開軟體,界面如下。成功點第三行第二個,編譯,如果程序寫的沒語法錯誤,下方會提示0錯誤0警告,並輸出HEX文件。編譯我們就是要用這個文件,可以通過下載器下載到單片機中。
  • 斷言(assert)的用法
    assert 宏的原型定義在 assert.h 中,其作用是如果它的條件返回錯誤,則終止程序執行。#include "assert.h" void assert( int expression );assert 的作用是現計算表達式 expression ,如果其值為假(即為0),那麼它先向 stderr 列印一條出錯信息,然後通過調用 abort 來終止程序運行。
  • ST在keil下開發時候文件options配置的一些小技巧
    本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】總述這是之前ST晶片載keil下開發時候總結的一些代碼文件options配置小筆記,雖然不是很複雜但是在使用的過程中很方便,這裡給大家介紹一下。