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

2021-01-07 電子工程世界

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

推薦閱讀

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

keil寫STM32程序出現literal treated as "long long"

在Keil MDKARM中unsigned int value2=0x80000000;unsigned int value4=2147483648;value2編譯時不產生警告,而value4就產生警告main.c(17): warning:  #1134-D: literal treated as "long long" 解決方法:關鍵是2147483648是一個字面常量,類型是int型,而不是unsigned int.上面這個語句,需要先將int類型,轉換成unsigned int類型,再賦值給value4;在轉換過程中,因為這個數值超過32位int類型的表示範圍,所以會

發表於 2020-09-18

相關焦點

  • Keil編譯常見問題
    需要將.C文件添加到工程文件中warning: #1-D main.c(7): warning: #1-D: last line of file ends without a newline當使用keil編譯時,彈出這樣的警告信息:main.c(7): warning: #1-D: last line of file ends without a newline
  • 老司機帶你深入理解ST庫中的assert_param語句
    (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))  void assert_failed(uint8_t* file, uint32_t line);#else  #define assert_param(expr) ((
  • keil編譯中所有編譯的錯誤信息
    5.Call of non-function in function main 調用未經過定義的函數.  6.cannot modify a const object in function main 對常量不能進行修改.
  • keil 中常見的幾種警告
    keil中常見的幾種警告,固然,相對於錯誤的,警告的程度不及錯誤的嚴重性,有時候忽略,會出現意想不到的錯誤。先看看常見的幾種錯誤,分析出來現的原因。本文引用地址:http://www.eepw.com.cn/article/201609/296870.htm  1.
  • keil-c常見編譯錯誤
    有這類錯誤時,給出提示但不產生目標文件,錯誤超過一定數量才終止編譯。3、警告:警告出現並不影響目標文件的產生,但執行時有可能發生問題。程式設計師應斟酌處理。編譯較大程序需要512k空間。*OPENING INPUT_FILE打開文件時,未找到或打不開源文件/頭文件。*CREATE LIST_FILE/OBJECT_FILE/WORK_FILE不能創建上述文件。可能磁碟滿或文件已存在而且防寫。
  • C語言陷阱與技巧20節,自定義「編譯時」assert方法,在代碼編譯階段...
    /a.out fd = -1編譯時 assert可以看出,assert() 用於處理C語言程序可能出現諸多預期之外的「意外」時很有用,它能夠自己輸出究竟哪一個「意外」發生。但是 assert() 也是死板的,它在遇到假條件時直接把程序終止,剩餘的代碼邏輯不再有機會執行。
  • keil添加PC-lint代碼靜態分析工具的方法
    e750... */有多少人認識這段代碼注釋?回答這個問題,就要牽涉到本文說的PC-Lint這個工具。有一定編程經驗的讀者,應該在一些地方都看到過類似  /*lint !e750... */ 這種「注釋」。
  • 解析單片機中的keil常見問題
    在程序中出現了如下警告:  *** WARNING L15: MULTIPLE CALL TO SEGMENT  SEGMENT: ?PR?_CRCDATA?PANEL_DISP  CALLER1: ?C_C51STARTUP  CALLER2: ?PR?UART_RECV?
  • Keil C編譯器常見警告與錯誤信息解決方法
    Keil C編譯器常見警告與錯誤信息解決方法1.C:\8051\MANN.C 程序過程中由於main.c 用了指令#i nclude 「beep.h」,但卻找不到所致解決方法編寫一個beep.h 的包含檔並存入到c:\8051 的工作目錄中4 Compling:C:\8051\LED.CError 237:』LedOn』:function already has a bod
  • STM32 keil printf的使用
    請在MDK(keil)工程屬性的「Target「-》」Code Generation「中勾選」Use MicroLIB本文引用地址:http://www.eepw.com.cn/article/201611/315976.htm前提是你有一個完整keil的工程 比如ADC的調試的時候很多時候用到串口
  • javascript中(function(){})($)與$(function)的區別
    之前一直沒弄清楚這兩者的區別,只是發現多個(function(){})($)之間定義的方法是可以互通的,以為這個會比較好,實際運用中發現並不是這麼簡單的。1. (function(){}())與(function(){})()這兩種寫法,都是一種立即執行函數的寫法,即IIFE (Immediately Invoked Function Expression)。
  • 【143】python 之斷言assert用法
    /usr/bin/env/python# -*-coding:utf-8-*-import pytest"""只對函數用例生效,不在類中setup_functionteardown_function"""def setup_function():    print "setup_function(
  • 斷言(assert)的用法
    assert 宏的原型定義在 assert.h 中,其作用是如果它的條件返回錯誤,則終止程序執行。#include "assert.h" void assert( int expression );assert 的作用是現計算表達式 expression ,如果其值為假(即為0),那麼它先向 stderr 列印一條出錯信息,然後通過調用 abort 來終止程序運行。
  • STM32+Keil 如何使用printf函數?
    thisisdonethroughSystemInit()functionwhichiscalledfromstartupfile(startup_stm32l1xx_xx.s)beforetobranchtoapplicationmain.
  • 深入理解 Dart Function & Closure
    void main() { var printName = (){ var name = 'Vadaski'; }; printName(); print(name); // Error:Undefined name 'name'}這裡出現了未定義該變量的錯誤警告
  • 《精通react/vue組件設計》之實現一個健壯的警告提示(Alert)組件
    >能控制關閉按鈕的文本,或者自定義關閉按鈕支持顯示提示內容的輔助文本內置提供不同類型的警告提示樣式,比如成功, 錯誤, 警告等關閉提示時能提供自定義事件/index.less'/*** 警告提示組件* @param {style} object 更改Alert樣式* @param {closable} bool 是否顯示關閉按鈕, 默認不顯示* @param