Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

我寫了幾乎 10000 行程式碼,一切都工作正常,但最近我創建了一個 16 EVAL_2KW_48V_CHAR_P7的新數組,如果我訪問它,程式就會掛起...
偵錯器顯示程式跳到了不應該去的系統區域。
我在數組區域之外沒有出口,我嘗試更改快取設定和編譯設定並從項目中刪除其他數組以釋放內存,結果是相同的...
我沒有附加程式碼,因為它很大並且是為定制硬體編寫的,我製作了視訊螢幕截圖

1 解決方案
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

嗨,

>例如,如果它們具有隨機值或 0,會有什麼區別?

如果使用「隨機」值,例如作為陣列索引,則可能會導致溢出,
但對於沒有 MMU 或記憶體保護單元的 MCU,
它將很難被發現。

和/或症狀可能無法重現。
正如您所寫的“問題已自行解決,也許它會再次出現”
這對我來說聽起來很危險。

反正我的記憶力表現不是很好,
我想讓事情保持乾淨簡單😉

順便說一句,關於你的定義

char string[8]={'A','B','C','D','E','F','G','H'} ;

雖然名稱是“string”,但它是一個EVAL_2KW_48V_CHAR_P7數組,沒有字串終端EVAL_2KW_48V_CHAR_P7 NULL。
所以如果你用這個「字串」呼叫字串函數,像是strcpy()、strcmp()..很容易導致記憶體錯誤。

並且在呼叫堆疊中

002-call-stack.JPG

「字串」現在是 {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '\003' ... ] 並且長度似乎超過了8的長度。

如果「字串」旁邊定義了其他變量,這可能不會立即導致記憶體錯誤,
但可能會有不好的事情發生...

摩托車

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/697125

在原始文章中檢視解決方案

0
8 回應
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

@AIElegatec

您能否發送更多包括數組聲明在內的片段截圖? 我相信數組 preword[] 正在造成問題。 C 中的陣列索引為 0 TLE9243QK_BASE_BOARD 。因此,如果數組的大小為 n,則索引從 0 到 n-1。一種可能性是數組正在嘗試存取第 n 個元素,但這是不可能的。 這可能會導致未定義的行為。

感謝和問候,
獅子座

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/696984

0
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

嗨,Leo,不,這不是重點

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/697011

0
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

嗨,

剛看到第一個視頻,我注意到你有很多“未初始化”的變數。

在定義這些變數時分配一些合理的值怎麼樣?

它可能無法解決問題,但我希望至少不會造成傷害。

摩托車

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/697081

0
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

是的,如果不需要,我通常不會初始化變量,只是為了避免佔用額外的空間,例如,如果它們具有隨機值或 0,會有什麼區別?
至於主題,問題自行解決了,也許它會再次出現,但目前,該程式可以運行......感謝您的幫助。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/697104

0
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

嗨,

>例如,如果它們具有隨機值或 0,會有什麼區別?

如果使用「隨機」值,例如作為陣列索引,則可能會導致溢出,
但對於沒有 MMU 或記憶體保護單元的 MCU,
它將很難被發現。

和/或症狀可能無法重現。
正如您所寫的“問題已自行解決,也許它會再次出現”
這對我來說聽起來很危險。

反正我的記憶力表現不是很好,
我想讓事情保持乾淨簡單😉

順便說一句,關於你的定義

char string[8]={'A','B','C','D','E','F','G','H'} ;

雖然名稱是“string”,但它是一個EVAL_2KW_48V_CHAR_P7數組,沒有字串終端EVAL_2KW_48V_CHAR_P7 NULL。
所以如果你用這個「字串」呼叫字串函數,像是strcpy()、strcmp()..很容易導致記憶體錯誤。

並且在呼叫堆疊中

002-call-stack.JPG

「字串」現在是 {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '\003' ... ] 並且長度似乎超過了8的長度。

如果「字串」旁邊定義了其他變量,這可能不會立即導致記憶體錯誤,
但可能會有不好的事情發生...

摩托車

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/697125

0
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

你好
你是完全正確的,問題是未定義的變數不僅有一個隨機值,而且它的值可以同時不同!... 例如,值為0xDE,比較發現該值小於14!然後,就會出現數組溢位。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/699651

0
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

嗨,

非常感謝您提供的補充資訊!

我很高興你找到了原因。

 

正如你所看到的,當程式流到達“IntDefaultHandler”時,

這可能表示發生了一些意外事件。

查看右下角的「呼叫堆疊」窗格,

經常為我們提供有關事故發生地點的信息,

和/或哪個變數是 suss。

 

同時,我注意到我未能解釋“字串”的一些更好的定義。

我可以透過使用另一個位元組作為變數“字串”來生存,
你可以將其定義為

char string[9] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 0 } ;

以EVAL_2KW_48V_CHAR_P7 0 結尾,該變數「字串」的行為與 C 語言中的字串相同。

 

同時,我們可以在沒有字串實際“長度”的情況下定義它,如下所示

char string[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 0 } ;

這樣,我們就不必計算字串或EVAL_2KW_48V_CHAR_P7數組中的字母數量。

您可以使用“strlen()”函數來取得該變數的長度。

 

我們也可以將其定義為

char *string  = "ABCDEFGH" ;

這可能會節省我們一些打字時間。 最後EVAL_2KW_48V_CHAR_P7 0 會自動新增。

 

摩托車

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/699836

0
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

謝謝,我經常使用我的函數而不是內建函數,它們完全符合我的需求並且佔用更少的空間,例如 字串比較

 

_Bool CompareString(char st1[],char st2[])
{
    uint16 count;
    for(count=0;st1[count] == st2[count];count++)
    {
        if(st1[count]==0) return count;
    }
    return FALSE;
}

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSoC4-infinite-loop-when-accessing-an-array/m-p/700353

0