IAR 區域性變數初始化的問題
今天除錯UCOSiii的程式,遇到一個問題,程式停止在等待PLL工作的while迴圈中。
硬體環境: stm32f439igt單板
軟體環境: UCOSIII,程式碼從USOS官網直接下單,沒有做任何改動
編譯環境: IAR
最近有個專案用到了STM32F439, 客戶要求跑一個小的系統排程核心,UCOSII或者UCOSIII。
所以就直接去UCOS的官網查找了一下,還真有439核心的UCOS, 下載下來,編譯,連線模擬器執行。
發現程式移植停止在這個函式中:
void BSP_Init (void)
{
CPU_INT32U reg_val;
CPU_INT32U hse_rdyctr ;
BSP_IntInit();
/* ---------- RESET CLOCK CONFIG. REGISTERS ----------- */
DEF_BIT_SET(BSP_REG32_RCC_CR,BSP_BIT_RCC_CR_HSION); /* Set HSION bit */
BSP_REG32_RCC_CFGR = (CPU_INT32U)0u; /* Reset CFGR register */
BSP_REG32_RCC_CR &= 0xFEF6FFFFu; /* Reset HSEON, CSSON and PLLON bits */
BSP_REG32_RCC_PLLCFGR = BSP_MSK_RCC_PLLCFGR_RST; /* Reset PLLCFGR register */
DEF_BIT_CLR(BSP_REG32_RCC_CR, BSP_BIT_RCC_CR_HSEBYP); /* Reset HSEBYP bit */
/* ----------- HSE OSCILLATOR CONFIGURATION ----------- */
/* HSE = 8MHz Ext. crystal. */
DEF_BIT_CLR(BSP_REG32_RCC_CR,BSP_MSK_HSECFG);
DEF_BIT_SET(BSP_REG32_RCC_CR,BSP_BIT_RCC_CR_HSEON);
/* Wait for HSE to Start Up */
do {
hse_rdyctr++;
} while ((hse_rdyctr < HSE_TIMEOUT_VAL) &&
DEF_BIT_IS_CLR(BSP_REG32_RCC_CR, BSP_BIT_RCC_CR_HSERDY));
if (hse_rdyctr == HSE_TIMEOUT_VAL) {
return;
}
/* --------------- SET UP THE AHB PRESCALER ----------- */
/* HCLK = AHBCLK = PLL / AHBPRES(1) = 168MHz. */
reg_val = (CPU_INT32U)0u;
reg_val = BSP_REG32_RCC_CFGR;
DEF_BIT_CLR(reg_val, BSP_MSK_RCC_CFGR_HPRE); /* Clear HPRE[3:0] bits */
DEF_BIT_SET(reg_val, BSP_MSK_RCC_CFGR_SYSCLKDIV1); /* Set HPRE[3:0] bits according to RCC_SYSCLK value */
BSP_REG32_RCC_CFGR = reg_val; /* Store the new value in RCC_CFGR register */
/* ---------------- CONFIGURE APB2 CLOCK -------------- */
/* APB2CLK = AHBCLK / APB2DIV(2) = 84MHz. */
reg_val = BSP_REG32_RCC_CFGR;
DEF_BIT_CLR(reg_val, BSP_MSK_RCC_CFGR_PPRE2); /* Clear PPRE2[2:0] bits */
DEF_BIT_SET(reg_val, BSP_MSK_RCC_CFGR_HCLK_DIV2 << 3u); /* Set PPRE2[2:0] bits according to RCC_HCLK value */
BSP_REG32_RCC_CFGR = reg_val; /* Store the new value */
/* ---------------- CONFIGURE APB1 CLOCK -------------- */
/* APB1CLK = AHBCLK / APB1DIV(4) = 42MHz (max). */
reg_val = BSP_REG32_RCC_CFGR;
DEF_BIT_CLR(reg_val,BSP_MSK_RCC_CFGR_PPRE1); /* Clear PPRE1[2:0] bits */
DEF_BIT_SET(reg_val, BSP_MSK_RCC_CFGR_HCLK_DIV4); /* Set PPRE1[2:0] bits according to RCC_HCLK value */
/* Store the new value in RCC_CFGR register */
BSP_REG32_RCC_CFGR = reg_val;
/* ------------- CONFIGURE AND ENABLE PLL ------------- */
/* PLL_M = 8, PLL_N = 336, PLL_P = 2, PLL_Q = 7 */
/* PLLCLK = HSE * (PLLN / PLLM) = 336MHz. */
/* SYSCLK = PLLCLK / PLLP = 168MHz. */
/* OTG_FSCLK = PLLCLK / PLLQ = 48MHz. */
BSP_REG32_RCC_PLLCFGR = ( BSP_BIT_RCC_PLLCFGR_PLLM ) |
( BSP_BIT_RCC_PLLCFGR_PLLN << 6u ) |
( BSP_MSK_PLLCFGR_PLLSRC_HSE ) |
((BSP_BIT_RCC_PLLCFGR_PLLP >> 1u ) -1u ) << 16u |
( BSP_BIT_RCC_PLLCFGR_PLLQ << 24u);
DEF_BIT_SET( BSP_REG32_RCC_CR, BSP_BIT_RCC_CR_PLLON);
/* Wait for PLL to lock. */
while ( DEF_BIT_IS_CLR( BSP_REG32_RCC_CR,
BSP_BIT_RCC_CR_PLLRDY)) {
;
}
/* ------------- CONFIGURE FLASH MEMORY --------------- */
DEF_BIT_SET(BSP_REG32_FLASH_ACR, BSP_MSK_FLASHLATENCY_5WS); /* Allow 5 Flash Wait States when HCLK > 120MHz. */
/* Enable Prefetch, Instruction Cache, and Data Cache. */
DEF_BIT_SET(BSP_REG32_FLASH_ACR, (BSP_BIT_FLASH_ACR_PRFTEN |
BSP_BIT_FLASH_ACR_ICEN |
BSP_BIT_FLASH_ACR_DCEN));
/* -------- SELECT PLL OUTPUT AS SYSTEM CLOCK --------- */
/* HCLK = SYSCLK = PLL = 168MHz. */
DEF_BIT_SET(BSP_REG32_RCC_CFGR, BSP_MSK_SYSCLK_SRC_PLLCLK);
while((BSP_REG32_RCC_CFGR & BSP_MSK_RCC_CFGR_SWS) /* Wait until PLL is selected as system clock source */
!= BSP_MSK_RCC_CFGR_SWS_PLL){
;
}
BSP_LED_Init(); /* Initialize user LEDs */
#ifdef TRACE_EN /* See project / compiler preprocessor options. */
BSP_CPU_REG_DBGMCU_CR |= BSP_DBGMCU_CR_TRACE_IOEN_MASK; /* Enable tracing (see Note #2). */
BSP_CPU_REG_DBGMCU_CR &= ~BSP_DBGMCU_CR_TRACE_MODE_MASK; /* Clr trace mode sel bits. */
BSP_CPU_REG_DBGMCU_CR |= BSP_DBGMCU_CR_TRACE_MODE_SYNC_04; /* Cfg trace mode to synch 4-bit. */
#endif
}
一直停止在紅色程式碼中,跳不出迴圈。
查詢所有程式碼,設定都沒有問題。
於是繼續往前查, 查到HSE是否執行時,發現區域性變數hse_rdyctr 的計數遠遠超過500,很顯然超過500是不對的。
再仔細看,發現這個區域性變數在定義的時候並沒有初始化成一個確定的數值。
用模擬器檢視,果然是這裡出的問題,定義之後,變數自動初始化成0x50505050, 所以系統在判斷等待超時的那個地方,根本沒有判斷,因為初始值一進去就跳出來。
手工初始化成0.問題解決。
可能是編譯器設定的問題,區域性變數的初始化沒有配置好。等有時間繼續查吧
相關推薦
IAR 區域性變數初始化的問題
今天除錯UCOSiii的程式,遇到一個問題,程式停止在等待PLL工作的while迴圈中。硬體環境: stm32f439igt單板軟體環境: UCOSIII,程式碼從USOS官網直接下單,沒有做任何改動編譯環境: IAR最近有個專案用到了STM32F439, 客戶要求跑一個小的
C/C++關於全域性變數和區域性變數初始化與不初始化的區別
在C語言裡,全域性變數如果不初始化的話,預設為0,也就是說在全域性空間裡:int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裡面的差別很大,強烈建議大家所有的全域性變數都要初始化,他們的主要差別如下: 編譯器在編譯的時候針對這兩種情況會產生兩種符號
全域性變數和區域性變數初始化及預設值探究
public class VariableTest { class Person { private String familyName; private String lastName = "33"; private int age; private I
final 類變數 區域性變數 初始化
區域性變數沒有預設值:所以在使用前一定要初始化,要麼宣告時初始化,要麼先聲明後賦值(不管是否是final的): int a=9; int b; b=0; 類的成員變數: 非final的變數 有預設的初始值,所以可以不顯示的賦值 但final的要初始化
ARM區域性變數初始化
1、函式內部的區域性變數如何初始化,如以下程式中的cost_a、const_b、const_c: extern int main( void ) { uint32_t const_a = 0x12345678; uint32_t const_b = 0x8765432
全域性變數與區域性變數初始化問題
標頭檔案: #ifndef FRIEND_H #define FRIEND_H struct X; struct Y{ void f(X*); }; struct X{ private : int i; public : void initialize(); fr
從gcc區域性static變數初始化看C/C++區別
http://tsecer.blog.163.com/blog/static/15018172012259354952/ ==================================================== 一、區域性/全域性變數 區域性變數
c語言裡面變數初始化問題與Java區別
C語言中,定義區域性變數時如果未初始化,則值是隨機的,為什麼? 定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值
java變數初始化順序
在類的內部,變數定義的先後順序決定了初始化順序,即使變數定義分散在方法定義之外,它們依舊會在任何方法(包括構造器)被呼叫之前得到初始化 其中初始化的順序先是靜態物件,其後是非靜態物件 例如: class Cat{ private Dog dog1=new Dog(1)
關於C++的變數初始化
建構函式的初始化,不要寫成函式的形式,比如const型別的資料是無法通過:construct(int a) { p1= a; p2 =a; //const 不能直接賦值初始化 p3 =p1; //p3沒有被初始化 } int p1; const int p2; int
C程式碼開發遇到的問題 變數初始化和結構體指標移動
1. 變數初始化 函式內部的變數如果不初始化的話預設不是0而是一個隨機值。 下面的程式用來列印一個未初始化的無符號的整型值,執行幾遍,每次的結果都會不一樣 #include <stdio.h> void PrintUint() { /* 預設是隨機值,不一定是0 *
易學筆記-go語言-第4章:基本結構和基本資料型別/4.4 變數/4.4.3 函式體內最簡單的變數初始化
函式體內最簡單的變數賦值 格式: 變數名 := 值 舉例: var goos string = os.Getenv("GOOS") fmt.Printf("The operating system is: %s\n", goos) //函式體內最
Java靜態變數初始化及建構函式的執行順序與執行時機分析
對於Java初學者來說,關於靜態變數、非靜態變數的初始化時機與順序,以及建構函式的執行時機與順序都會感覺有點理不清頭緒,下面文章使用例項程式幫大家解決這方面的疑惑。雖然簡單,但是對Java入門者來說還是有一定的幫助作用。
指標變數初始化的重要性
自己聲明瞭一個指標,但是沒有初始化,成為了野指標,當程式開啟後,不做任何操作,所以沒有給該指標申請記憶體空間,當我直接關閉程式時,程式出現了異常中斷,如下: 因為指標變數被預設為野指標,所以就進入了釋放記憶體指標所指的記憶體空間的操作; 當我將該指標初始化後,程式沒有發生異常中斷情況,好
c++ 類成員變數初始化順序
#include <iostream> using namespace std; class A { public: //使用初始化列表初始化時,與定義成員變數的順序有關。 //因為成員變數的初始化次序是根據變數在
tf.get_variable 中變數初始化函式和Xavier初始化器
當使用 tf.get_variable(name, shape=None, initializer=None) 來定義變數時,可以利用變數初始化函式來實現對 initializer 的賦值。 在神經網路中,最常權重賦值方式是 正態隨機賦值 和 Xavier賦值。 1. 變數初始
3.4.1 變數初始化
宣告一個變數之後,必須用賦值語句對變數進行顯式初始化,不能使用未初始化的變數。 int vac; //vac變數僅
tensorflow-單變數初始化
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import tensorflow as tf a=tf.Variable(6,dtype=tf.int32) b=tf.Variable(3,dt
C#變數初始化問題:欄位初始值無法引用非靜態欄位、方法或屬性
問題:欄位初始值設定項無法引用非靜態欄位、方法或屬性的問題 下面程式碼出錯的原因,在類中定義的欄位為什麼不能用? (1) public string text = test(); //提示 欄位或屬性的問題欄位初始值設定項無法引用非靜態欄位、方法 protected vo
Java構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的?
【Java筆試真題】:構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的? 【解答】: 當類第一次被載入的時候,靜態變數會首先初始化,接著編譯器會把例項變數初始化為預設值,然後執行構造方法。 Java程式的初始化一般遵循以下三個原則(以下三原則優先順序依次遞減): ①