集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
uj5u.com熱心網友回復:
標記下。最近也要開始搞STM8S005K6的IAP。希望和你一起探討下uj5u.com熱心網友回復:
歡迎歡迎!
uj5u.com熱心網友回復:
最近在搞stm8s207的IAP,程式可以正常作業,但是在進行塊編程時,總是停在這個函式里void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)的while(Count<128)處,然后也無法單步除錯下去,就一直停在那。
若在while前設定中斷,再單步除錯就能夠正常走下去。一直不知道原因在何處。想問問你有沒有遇到過?
uj5u.com熱心網友回復:
1.首先查一下是不是你的代碼邏輯問題,例如這些個計量引數是不是有陷阱,時常遇到樹和樹樁 數目差一的問題。
另外查查有沒有指標越界的問題。
2.如果確認1沒有問題,看看在flash擦除、編程等操作時,你有沒有錯誤的操作。
我印象中是記得,有MCU是要求在flash操作時要特別注意什么的。
在flash操作時,最好關閉所有中斷。
不要擔心關閉了接收中斷會引來資料丟失。在傳輸升級資料時,基本都要采用應答的方式來保證資料不會丟失。
uj5u.com熱心網友回復:
看樣子LZ應該用過挺多STM8的片子用于專案的。我目前很頭疼的事情,目前有一批低功耗無線的板子,用的是STM8L051的片子,現在出現大批量出問題的(功耗很大),貌似引腳被打壞了。
目前面臨著重新選型的困惱,價格要差不多,并且睡眠能做到比較穩定的功耗
uj5u.com熱心網友回復:
L系列的不就是低功耗的嗎,怎么還會反饋功耗大呢,建議軟硬體都查查再決定要不要重新選型
uj5u.com熱心網友回復:
樓主,我想在IAP和APP里面都使用中斷,我是在IAP里面重新映射了中斷向量表(試過在APP里面映射,但是APP中中斷使用不了),想問一下你之前是兩個同時使用中斷的嗎uj5u.com熱心網友回復:
可以啊,IAP和APP各自使用各自的中斷ISP,沒有問題。
不知你是怎么做的重映射?
uj5u.com熱心網友回復:
寫錯了,ISR
uj5u.com熱心網友回復:
看樣子LZ應該用過挺多STM8的片子用于專案的。
我目前很頭疼的事情,目前有一批低功耗無線的板子,用的是STM8L051的片子,現在出現大批量出問題的(功耗很大),貌似引腳被打壞了。
目前面臨著重新選型的困惱,價格要差不多,并且睡眠能做到比較穩定的功耗
L系列的不就是低功耗的嗎,怎么還會反饋功耗大呢,建議軟硬體都查查再決定要不要重新選型
因為我使用的是051的片子,相對151的價格便宜很多。而且資源差不多,所以我懷疑是片子自身的電氣特性缺漏造成的(st賣的比較便宜)
uj5u.com熱心網友回復:
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
uj5u.com熱心網友回復:
做過LPC17xx系列的IAP 和STM8應該類似uj5u.com熱心網友回復:
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
在IAR中使用關鍵字 __ramfunc就可以了
uj5u.com熱心網友回復:
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
或者 ST的官方庫中有示例的
uj5u.com熱心網友回復:
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
剛想回答的,上面一位仁兄已經回答了,差不多也是用這個方法解決問題。
似憾訓有另一種方法,也可以實作。不過我沒有去測驗過,不敢瞎說。
之前在LPC上這么干過,將代碼加載到RAM中運行,我最初是在ADS1.2上做到的,測驗也是有效的。
之后在keil,也就是現在叫的MDK上也試過。因為ADS1.2和MDK的分散加載腳本的語法幾乎完全一樣,我直接套過來就可以用了。
不過在IAR上我沒試過,我正想這么試一下的。
uj5u.com熱心網友回復:
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
樓主,塊編程時,代碼必須在Ram中運行,在塊編程時Flash程式將會停止運行。但是,我把那個函式放到RAM里還是不行呀。
想問問,IAR怎么把代碼拷貝到RAM,是下面這樣設定
#pragma location = "FLASH_CODE"
void Mem_ProgramBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType, u8 *Buffer)
{
}
然后,icf檔案里加上這一句嗎,initialize by copy { section FLASH_CODE};
我在map檔案里看見確實已經放在RAM里,可還是卡住了。
Mem_ProgramBlock 0x000010 0x86 Code Gb main.o [1]
剛想回答的,上面一位仁兄已經回答了,差不多也是用這個方法解決問題。
似憾訓有另一種方法,也可以實作。不過我沒有去測驗過,不敢瞎說。
之前在LPC上這么干過,將代碼加載到RAM中運行,我最初是在ADS1.2上做到的,測驗也是有效的。
之后在keil,也就是現在叫的MDK上也試過。因為ADS1.2和MDK的分散加載腳本的語法幾乎完全一樣,我直接套過來就可以用了。
不過在IAR上我沒試過,我正想這么試一下的。
補充一下,這個方法,只是修改分散加載腳本,不用在代碼中用任何關鍵字。
另外,我當時只做到,把需要加載到RAM中的代碼全部寫到一個檔案中,然后分散加載腳本讓這個檔案全部加載到RAM中。
想要讓某個檔案中的部分函式加載到RAM中,當時沒有實作,也不知道能不能實作,之后沒再研究了。
uj5u.com熱心網友回復:
這里有個講得比較細的貼子,可以看一下http://bbs.21ic.com/icview-961176-1-1.html
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
之前的設計思路是boot中用到那個中斷就將需要的中斷映射到RAM中,使用82跳轉,其余的還是統一跳轉到app中建立向量表處理,所以在app中只需要特別處理boot中使用的中斷就可以了,但是現在增加了兩個boot中不使用的中斷,app韌體中中斷不執行,一直跑飛,郁悶呢
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
之前的設計思路是boot中用到那個中斷就將需要的中斷映射到RAM中,使用82跳轉,其余的還是統一跳轉到app中建立向量表處理,所以在app中只需要特別處理boot中使用的中斷就可以了,但是現在增加了兩個boot中不使用的中斷,app韌體中中斷不執行,一直跑飛,郁悶呢
你這樣做是可以做,不過感覺方法不系統,不規整,用久了,忘記了就會出問題。
你不妨這么干:
我們知道系統在發生中斷的時候,會最先自動跳轉到flash的某個特定地址。(這里不討論像那種利用暫存器來偏移向量表的方法,因為很多單片機并不具有這種非通用的特性)
我們就讓flash的這個地址,填入指令,cpu再次跳轉到特定的RAM地址。
在每次進去程式時,使能總中斷前,把ISR的地址填到這個RAM中,之后發生中斷,程式就會跳到對應的ISR中。
這樣的話,進入boot程式時,在使能總中斷前,把這個特定RAM中填入boot程式要用到的中斷ISR。
同理,進到APP時,也這么干。APP和boot的同種中斷源,但ISR不一樣,所以ISR的地址也不一樣。我們就可以用這種方法解決。
既然你知道跳轉指令,會跳一次,再跳第二次又有什么問題呢,也就是跳轉時壓堆疊和彈堆疊需要特別注意。
不過如果匯編這塊確實不好弄,可以用C寫的函式替代下
因為RAM是可改寫的,
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
之前的設計思路是boot中用到那個中斷就將需要的中斷映射到RAM中,使用82跳轉,其余的還是統一跳轉到app中建立向量表處理,所以在app中只需要特別處理boot中使用的中斷就可以了,但是現在增加了兩個boot中不使用的中斷,app韌體中中斷不執行,一直跑飛,郁悶呢
你這樣做是可以做,不過感覺方法不系統,不規整,用久了,忘記了就會出問題。
你不妨這么干:
我們知道系統在發生中斷的時候,會最先自動跳轉到flash的某個特定地址。(這里不討論像那種利用暫存器來偏移向量表的方法,因為很多單片機并不具有這種非通用的特性)
我們就讓flash的這個地址,填入指令,cpu再次跳轉到特定的RAM地址。
在每次進去程式時,使能總中斷前,把ISR的地址填到這個RAM中,之后發生中斷,程式就會跳到對應的ISR中。
這樣的話,進入boot程式時,在使能總中斷前,把這個特定RAM中填入boot程式要用到的中斷ISR。
同理,進到APP時,也這么干。APP和boot的同種中斷源,但ISR不一樣,所以ISR的地址也不一樣。我們就可以用這種方法解決。
既然你知道跳轉指令,會跳一次,再跳第二次又有什么問題呢,也就是跳轉時壓堆疊和彈堆疊需要特別注意。
不過如果匯編這塊確實不好弄,可以用C寫的函式替代下
因為RAM是可改寫的,
剛才換了一下跳轉地址,莫名其妙的就好了,原來使用0X100~0x110作為4個中斷二級跳轉地址,現在使用0x200~0x210地址就OK了,感覺奇怪....
uj5u.com熱心網友回復:
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
集合帖:STM8之支持中斷方式的IAP技術實作
之前在搞STM8的IAP時,我發了個相關的貼子:
http://bbs.csdn.net/topics/390855678
本來也只是想當做技術交流的貼子,沒想到后面兩年時不時有人找我詢問相關的技術問題。
但因為這兩年已經沒再做stm8單片機相關的東西,具體的技術實作也都忘得差不多了,特別是當時的核心代碼也找不到了。
當時這個專案是做私活搞的,最后定下來不需要IAP,東西最后又沒有形成產品,所以如果大家要把該技術用于產品,還需謹慎,需要多測驗和分析。
這里我會把完整的分析流程給出,并且給出最終的原始碼。之前問過我的童鞋、現在正在搞相關內容的童鞋,都可以在這里發問。
之前使用RAM中重映射向量沒問題,新增了兩個中斷,出現問題了,程式一直跑飛,目前沒有思路了
版本回滾一下,確認一下是不是新引入的這兩個中斷導致的問題
之前的設計思路是boot中用到那個中斷就將需要的中斷映射到RAM中,使用82跳轉,其余的還是統一跳轉到app中建立向量表處理,所以在app中只需要特別處理boot中使用的中斷就可以了,但是現在增加了兩個boot中不使用的中斷,app韌體中中斷不執行,一直跑飛,郁悶呢
你這樣做是可以做,不過感覺方法不系統,不規整,用久了,忘記了就會出問題。
你不妨這么干:
我們知道系統在發生中斷的時候,會最先自動跳轉到flash的某個特定地址。(這里不討論像那種利用暫存器來偏移向量表的方法,因為很多單片機并不具有這種非通用的特性)
我們就讓flash的這個地址,填入指令,cpu再次跳轉到特定的RAM地址。
在每次進去程式時,使能總中斷前,把ISR的地址填到這個RAM中,之后發生中斷,程式就會跳到對應的ISR中。
這樣的話,進入boot程式時,在使能總中斷前,把這個特定RAM中填入boot程式要用到的中斷ISR。
同理,進到APP時,也這么干。APP和boot的同種中斷源,但ISR不一樣,所以ISR的地址也不一樣。我們就可以用這種方法解決。
既然你知道跳轉指令,會跳一次,再跳第二次又有什么問題呢,也就是跳轉時壓堆疊和彈堆疊需要特別注意。
不過如果匯編這塊確實不好弄,可以用C寫的函式替代下
因為RAM是可改寫的,
stm8的壓堆疊與彈堆疊不用太關心,只要ISR使用相關的關鍵字定義就會自動處理入堆疊與出堆疊,并且82或者AC指令并不涉及到堆疊的問題
uj5u.com熱心網友回復:
圍觀圍觀 .STM8實作IAP
uj5u.com熱心網友回復:
最近也一直在弄STM8的IAP,學習學習~uj5u.com熱心網友回復:
馬克一下!正在學習中~uj5u.com熱心網友回復:
在STM8上做bootloader感覺沒太大意義,樓主這樣做的目的是什么呢?將APP程式發給用戶自己升級而不至于泄露整體代碼?但是這種小芯片的程式一般定型后就不需要更改了,用上bootloader反而占用flash空間,樓主這樣做還有其他目的嗎?uj5u.com熱心網友回復:
在STM8上做bootloader感覺沒太大意義,樓主這樣做的目的是什么呢?將APP程式發給用戶自己升級而不至于泄露整體代碼?但是這種小芯片的程式一般定型后就不需要更改了,用上bootloader反而占用flash空間,樓主這樣做還有其他目的嗎?
意義大不大,我也定不了,由產品經理說了算。事先或許產品經理可能會覺得沒必要,到時產品出去了,他要一句話回來說要升級,你說怎么辦。像這種事先定好覺得沒問題,后面返工的事還少嗎,所以還是留條路吧。
uj5u.com熱心網友回復:
在STM8上做bootloader感覺沒太大意義,樓主這樣做的目的是什么呢?將APP程式發給用戶自己升級而不至于泄露整體代碼?但是這種小芯片的程式一般定型后就不需要更改了,用上bootloader反而占用flash空間,樓主這樣做還有其他目的嗎?
對了,還忘說了一點,STM8如果做成產品,不做IAP功能,到用戶那里,你難道打算用ISP的方式,讓用戶自己升級嗎?
難道你做成產品也要留出燒錄介面給用戶用嗎?
目前就看到51有些單片機,例如STC的一些型號,燒錄直接用串口,ISP和IAP幾乎可認為是一樣的,還可以做成不考慮做IAP功能的。
uj5u.com熱心網友回復:
我的芯片是stm8s003f3, boot 是0x8000-0x87ff,app:0x8800-0x9fff ; 中斷向量用的還是默認的,在中斷產生時候,通過在記憶體特定地址(boot&app都要定)做一個標記 ,標記中斷來至哪段程式,如果是boot就在boot的分支處理,如果是app的就跳到app的向量表中;我寫下偽代碼__no_init unsigned char boot_flag;
INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25)
{
if(boot_flag)
{
// boot_tmr4_isr();
}else
{
asm("LDW Y, $886c "); //886c 是app的tmr4向量位置,把這個位置的值copy到Y暫存器中,
asm("JP(Y)"); //跳轉到Y(886c對應的ISR 地址)
}
因為st沒有提供統一ISR的入口,只能每個中斷自己去跳轉這樣處理了,我測驗過應該是沒什么問題的。
uj5u.com熱心網友回復:
樓主,我想在IAP和APP里面都使用中斷,我是在IAP里面重新映射了中斷向量表(試過在APP里面映射,但是APP中中斷使用不了),想問一下你之前是兩個同時使用中斷的嗎
可以啊,IAP和APP各自使用各自的中斷ISP,沒有問題。
不知你是怎么做的重映射?
樓主,請問,你是怎么把ISR地址分開的。就是你在8000寫了什么,在RAM里又寫了什么,能不能貼下代碼。
uj5u.com熱心網友回復:
去年也在想著STM32實作IAP,公司一直沒有要求,然后程式斷斷續續的寫了一點,后來就離職了,呵呵,還是希望有機會繼續做STM32,只可惜目前開始做DSP了,樓主加油!uj5u.com熱心網友回復:
樓主不錯,mark一下,會用到的uj5u.com熱心網友回復:
樓主不錯,mark一下,會用到的uj5u.com熱心網友回復:
馬一下,最近正好在做stm8的應用uj5u.com熱心網友回復:
謝謝分享,學習了~~uj5u.com熱心網友回復:
謝謝分享,學習了~~uj5u.com熱心網友回復:
正在用stm8,markuj5u.com熱心網友回復:
STM32快速入門的知識那里有啊 ! 剛上手一塊板子想玩一下。uj5u.com熱心網友回復:
謝謝分享,學習了~~uj5u.com熱心網友回復:
我一般喜歡把程式分成兩部分, 一部分實作通訊協議, 刷機程式啥的, 一部分實作功能代碼, 動態加載或者從串口啥的注入, 這樣生產后可以隨時升級 ... 順便兩個部分相互驗證完整性, 簡單加個密啥的... 在個 51 上我用 12K (好像填充了 6K左右的亂數) 放通訊, 4K 做功能代碼 ...uj5u.com熱心網友回復:
謝謝樓主分享,這個還是很實用的uj5u.com熱心網友回復:
我一般喜歡把程式分成兩部分, 一部分實作通訊協議, 刷機程式啥的, 一部分實作功能代碼, 動態加載或者從串口啥的注入, 這樣生產后可以隨時升級 ... 順便兩個部分相互驗證完整性, 簡單加個密啥的... 在個 51 上我用 12K (好像填充了 6K左右的亂數) 放通訊, 4K 做功能代碼 ...
你用到了串口注入的功能,是用的動態庫方式的嗎(地址無關方式)?
這可是很高級的功能呢
uj5u.com熱心網友回復:
我一般喜歡把程式分成兩部分, 一部分實作通訊協議, 刷機程式啥的, 一部分實作功能代碼, 動態加載或者從串口啥的注入, 這樣生產后可以隨時升級 ... 順便兩個部分相互驗證完整性, 簡單加個密啥的... 在個 51 上我用 12K (好像填充了 6K左右的亂數) 放通訊, 4K 做功能代碼 ...
你用到了串口注入的功能,是用的動態庫方式的嗎(地址無關方式)?
這可是很高級的功能呢
51 RAM/ROM都太小, 指令密度也太低, ABI還特別怪異, 可能 STM8 會好些, 我是預先把 RAM/ROM 預先分配給兩個不同的程式, 這樣上位機可以隨時通過命令升級程式, 還算蠻方便, 就是分成兩個程式后, ROM會多消耗一點..
32位的片子跑PIC代碼可行些.
uj5u.com熱心網友回復:
我一般喜歡把程式分成兩部分, 一部分實作通訊協議, 刷機程式啥的, 一部分實作功能代碼, 動態加載或者從串口啥的注入, 這樣生產后可以隨時升級 ... 順便兩個部分相互驗證完整性, 簡單加個密啥的... 在個 51 上我用 12K (好像填充了 6K左右的亂數) 放通訊, 4K 做功能代碼 ...
你用到了串口注入的功能,是用的動態庫方式的嗎(地址無關方式)?
這可是很高級的功能呢
51 RAM/ROM都太小, 指令密度也太低, ABI還特別怪異, 可能 STM8 會好些, 我是預先把 RAM/ROM 預先分配給兩個不同的程式, 這樣上位機可以隨時通過命令升級程式, 還算蠻方便, 就是分成兩個程式后, ROM會多消耗一點..
32位的片子跑PIC代碼可行些.
51的體系結構,我沒有深入去看,平時也沒有怎么用51內核的芯片,不過,在大學的時候倒是看書了解過51的匯編,確實不如ARM的規整。這可能就是你說的ABI比較怪異吧。STM8雖然不是ARM架構的,但確實是非常規整了,甚至它還支持軟中斷,這一般是OS才會用得到CPU支持。
預先分配RAM和ROM,我大致理解,不過這樣的話,不同的程式之間會有一些關聯性了,需要較好的程式控制能力。
32位的ARM,確實支持PIC。即使是裸機也沒有問題,可以做到動態加載。
RWPI是依靠R9這個暫存器支持出來的。ROPI的話,一般的匯編指令體系都會支持相對尋址,所以這個不難。
至于STM8還有51,是怎么做PWPI,我就不大清楚了。
uj5u.com熱心網友回復:
我一般喜歡把程式分成兩部分, 一部分實作通訊協議, 刷機程式啥的, 一部分實作功能代碼, 動態加載或者從串口啥的注入, 這樣生產后可以隨時升級 ... 順便兩個部分相互驗證完整性, 簡單加個密啥的... 在個 51 上我用 12K (好像填充了 6K左右的亂數) 放通訊, 4K 做功能代碼 ...
你用到了串口注入的功能,是用的動態庫方式的嗎(地址無關方式)?
這可是很高級的功能呢
51 RAM/ROM都太小, 指令密度也太低, ABI還特別怪異, 可能 STM8 會好些, 我是預先把 RAM/ROM 預先分配給兩個不同的程式, 這樣上位機可以隨時通過命令升級程式, 還算蠻方便, 就是分成兩個程式后, ROM會多消耗一點..
32位的片子跑PIC代碼可行些.
51的體系結構,我沒有深入去看,平時也沒有怎么用51內核的芯片,不過,在大學的時候倒是看書了解過51的匯編,確實不如ARM的規整。這可能就是你說的ABI比較怪異吧。STM8雖然不是ARM架構的,但確實是非常規整了,甚至它還支持軟中斷,這一般是OS才會用得到CPU支持。
預先分配RAM和ROM,我大致理解,不過這樣的話,不同的程式之間會有一些關聯性了,需要較好的程式控制能力。
32位的ARM,確實支持PIC。即使是裸機也沒有問題,可以做到動態加載。
RWPI是依靠R9這個暫存器支持出來的。ROPI的話,一般的匯編指令體系都會支持相對尋址,所以這個不難。
至于STM8還有51,是怎么做PWPI,我就不大清楚了。
讓不同程式之間相互關聯本身是開始設計的一個目標之一, 兩個部分相互驗證完整性, 在要求不高的時候可以省塊加密芯片, 我往每個片子刷入的控制程式是唯一的, 很多控制引數是用一些硬體ID計算出來的.
RWPI/ROPI 這種應該對不是古董的 ISA 都還好, 一般就有個 gp 暫存器指向全域變數的地址, 跨模塊呼叫時候調整下就好, 古董的x86就比較難看 ..
不過我一般喜歡這種額外注入的模塊都完全不使用全域變數, 這樣就沒調整 gp 的問題, 搞起來特別簡單 ..
對ROM/RAM都特別小的MCU, 還是預先分配下 ROM/RAM 更簡單一些 ..
uj5u.com熱心網友回復:
不錯,mark一下uj5u.com熱心網友回復:
學習學習一下,進步不易uj5u.com熱心網友回復:
中斷IAP實作起來確實很好用uj5u.com熱心網友回復:
標記下。最近也要開始搞STM8S005K6的IAP。希望和你一起探討下轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/40886.html
標籤:單片機/工控
上一篇:keil寫stm32出現的問題
下一篇:這段代碼里的賦值有點看不懂
