STM32分區跳轉問題

項目場景:

在OTA中,FLASH通常被劃分為以下幾種類型

  • bootloader+iap+app
  • bootloader+app+app保存區
  • bootloader+app1+app2
    不同的分區方式有不同的有點,但是共同點都是需要執行分區跳轉

問題1描述

但在分區跳轉過程中遇到過使用不同的編譯器不能跳轉的情況,例如在keil中使用v5編譯器可以正常跳轉,但是使用v6編譯器就無法跳轉了。

void JumpToCode(uint32_t addr) {uint32_t *inputAddr = (uint32_t *)addr;uint32_t jumpAddr  = *(uint32_t *)(addr + 4);if ((*inputAddr & 0x2FFE0000) == 0x20000000) {__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}

問題1原因分析:

發現v6和v5的編譯優化不一樣,v6編譯執行__set_MSP后,跳轉地址變量jumpAddr被釋放,就不能正確跳轉了。把地址相關的變量聲明為全局變量就可以正常跳轉了

uint32_t *inputAddr;  // !聲明為全局變量,防止執行__set_MSP后,變量被釋放
uint32_t jumpAddr;    // !設置MSP后改變了棧底地址,導致原來的局部變量范圍出了新棧的空間,被系統釋放void JumpToCode(uint32_t addr) {inputAddr = (uint32_t *)addr;jumpAddr  = *(uint32_t *)(addr + 4);if ((*inputAddr & 0x2FFE0000) == 0x20000000) {__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}

問題2描述

裸機時可以正常跳轉,但是開啟freertos后分區無法相互跳轉,度娘說要跳轉前需要關閉全局中斷、關閉外設。我采用的分區方式是bootloader+iap+app,boot跳轉前關閉中斷和外設后,跳轉freertos的app分區沒有問題,而跳轉裸機的iap分區時無法運行,發現卡在初始化中。為什么跳freertos就ok呢?最后發現MX_FREERTOS_Init的時候自動把中斷打開了,原來跳轉后在main函數中需要重新開啟中斷,在其他所有裸機的main函數的while前添加__set_FAULTMASK(0)開啟中斷即可,freertos不需要。修改后的跳轉代碼如下:

uint32_t *inputAddr;  // !聲明為全局變量,防止執行__set_MSP后,變量被釋放
uint32_t jumpAddr;    // !設置MSP后改變了棧底地址,導致原來的局部變量范圍出了新棧的空間,被系統釋放void JumpToCode(uint32_t addr) {inputAddr = (uint32_t *)addr;jumpAddr  = *(uint32_t *)(addr + 4);if ((*inputAddr & 0x2FFE0000) == 0x20000000) {HAL_RCC_DeInit();HAL_DeInit();__set_FAULTMASK(1);__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}

問題3描述

boot可以跳iap和app了,但是!但是app無法跳iap,最后發現FREERTOS運行在PSP模式,而裸機運行在MSP模式,嘗試跳轉前設定MSP就正常了,添加__set_CONTROL(0),最終的跳轉如下:

uint32_t *inputAddr;  // !聲明為全局變量,防止執行__set_MSP后,變量被釋放
uint32_t jumpAddr;    // !設置MSP后改變了棧底地址,導致原來的局部變量范圍出了新棧的空間,被系統釋放void JumpToCode(uint32_t addr) {inputAddr = (uint32_t *)addr;jumpAddr  = *(uint32_t *)(addr + 4);if ((*inputAddr & 0x2FFE0000) == 0x20000000) {HAL_RCC_DeInit();HAL_DeInit();__set_FAULTMASK(1);__set_CONTROL(0);__set_MSP(*inputAddr);((void (*)(void))jumpAddr)();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java,泛型

目錄 泛型的理解: 在ArrayList中使用泛型: 在Map中使用泛型: 在接口中使用泛型: 自定義泛型類/接口與自定義泛型方法 自定義類/接口: 關于泛型類的子類: 注意點: 注意點: 自…

MATLAB實現灰色預測

久違了,前段時間由于學習壓力大,就沒怎么更新MATLAB相關的內容,今天實在學不進去了,換個內容更新一下~ 本貼介紹灰色預測模型,這也是數學建模競賽常見算法中的一員,和許多預測模型一樣——底層原理是根據已…

監控員工上網有什么軟件丨三款好用的員工上網管理軟件推薦

監控員工上網行為是企業管理中不可或缺的一部分,因此,選擇一款好的監控員工上網的軟件至關重要。目前市場上存在多種監控員工上網的軟件,它們具有各種特點和功能,但企業需要仔細評估和選擇。 一、域之盾軟件 這是一款優秀的監控員…

利用GenericMenu創建上下文菜單或下拉菜單

使用GenericMenu 創建自定義上下文菜單和下拉菜單豐富自己的編輯器功能。 GenericMenu 介紹 變量 allowDuplicateNames 允許菜單具有多個同名的菜單項。 公共函數 AddDisabledItem 向菜單添加已禁用的項。 AddItem 向菜單添加一個項。 AddSeparator 向菜單添加一個分隔符項…

grafana二次啟動失敗

背景 安裝grafana后啟動使用正常,但是關機后再啟動顯示啟動失敗,但是看日志又沒有報錯信息,但是就是啟動不了 原因分析 其實是/var/lib/grafana/grafana.db文件損壞了,所以需要把這個文件刪掉之后重新啟動就正常了,…

如何在AppLink配置金蝶云星空預算使用單流程

上一篇有提到金蝶云星空如何通過AppLink平臺配置銷售訂單操作,這次來演示下如何“保存預算使用單”、“調撥單定時自動審核”以及“預算使用單反審核后刪除”操作。 根據請求數據保存預算使用單 當webhook接收到數據時觸發流程 步驟1:根據webhook的請…

OpenGL YUV 和 RGB 圖像相互轉換出現的偏色問題怎么解決?

未經作者(微信ID:Byte-Flow)允許,禁止轉載 文章首發于公眾號:字節流動 早上知識星球里的一位同學,遇到 yuv2rgb 偏色問題,這個問題比較典型,今天展開說一下。 省流版 首先 yuv2rgb 和 rgb2yuv 之間的轉換要基于相同的標準,轉換使用不同的標準肯定會引起偏色,常見的…

短視頻矩陣系統源碼搭建部署分享

一、 短視頻矩陣系統源碼搭建部署分享 目錄 一、 短視頻矩陣系統源碼搭建部署分享 二、短視頻矩陣系統搭建功能設計 三、 抖音矩陣號矩陣系統功能設計原則 四、 短視頻矩陣開發部分源碼展示 很高興能夠幫助您,以下是短視頻矩陣系統源碼搭建部署分享&#xff1a…

怎么快速卸載office365

怎么快速卸載office365 根據官網提供的兩種解決方案即點即用或MSIMicrosoft Store 根據官網提供的兩種解決方案 官網地址:https://support.microsoft.com/zh-cn/office/%E4%BB%8E-pc-%E5%8D%B8%E8%BD%BD-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8#OfficeVersio…

sql經典練習(包括運行通過代碼)

建庫 導入數據庫并運行 # 學生表 Student: ? create table Student( ? SId varchar(10) , ? Sname varchar(10), ? Sage datetime, ? Ssex varchar(10)); ? insert into Student values(01 , 趙鐵柱 , 1990-01-01 , 男); ? insert into Student values(02 …

智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼)

文章目錄 效果一覽文章概述源碼設計參考資料效果一覽 文章概述 智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼) 源碼設計 %%clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000

PHP 正則式 全能匹配URL(UBB)

PHP 正則式 全能匹配URL(UBB) 語言:PHP 注明:正則式 無語言限制(js、PHP、JSP、ASP、VB、.net、C#...)一切皆可。 簡介:PHP UBB 正則式 全能匹配URL 自動加超級鏈接。網上找了很多都不匹配或…

數字化轉型過程中面臨最大的問題是什么?如何借助數字化工具實現快速轉型?

在科技快速發展的時代,數字化轉型已經成為企業的重要戰略。當企業努力適應數字化時代并取得成功時,他們可能會面臨各種必須有效應對的挑戰。   數字化轉型不僅僅是將新技術應用到企業的運營中,還需要對企業的運營方式、與客戶的互動方式和價…

數字人直播系統開發要注意的陷阱

數字人做為元宇宙的底層基座,BAT都在跑步進場,目前具有前瞻性的公司都在布局數字人產業。數字人可以應用于很多業務場景,對今年來說,無疑數字人直播系統是最火的。像去年數字人直播SAAS系統定制開發的話沒有個百把萬是下不來的。但…

求臻醫學六周年,我們的故事值得被記錄

6載光陰求臻醫學持續以科技創新推動產業升級在腫瘤精準診療領域持續深耕致力于為腫瘤患者生命續航每一位求臻人都是我們前進的力量也是我們不斷創新的源泉我們不拘泥于一種聲音以多元化的視角探索前行

app小程序定制的重點|軟件定制開發|網站搭建

app小程序定制的重點|軟件定制開發|網站搭建 App小程序定制開發是近年來快速發展的一項技術服務,隨著移動互聯網的普及和用戶需求的不斷升級,越來越多的企業和個人開始關注和需求定制化的小程序開發。那么,對于app小程序定制開發來說&#xf…

基于枚舉實現的橋接模式

基于枚舉實現的橋接模式 這里是基于枚舉方式來維護的橋接模式,維護抽象化和實現化的關系。 橋接模式的應用場景: 當一個類內部具備兩種或多種變化維度時,使用橋接模式可以解耦這些變化的維度,使高層代碼架構穩定。 橋接模式通常…

【微信小程序】繪制二維碼實現及解決canvas層級問題最佳實踐

前言 很久沒寫微信小程序的需求了,今天來活兒要做個二維碼掃碼相關的需求,本來以為是灑灑水的事情,誰知道也折磨了大半天,今天特此記錄一下~ 需求:點擊按鈕,彈出二維碼,二維碼內容固定為test …

獨孤思維:不喜愛的再賺錢也別碰,因為你愛無能

很多人都說什么工作收入高做什么; 很多女人說哪個男人有錢嫁哪個; 很多粉絲說什么項目賺錢做什么。 本質上不是你愛這個工作,愛這個男人,愛這個項目。 而是你愛錢。 但是愛錢,要付出代價。 工作收入高&#xff0…

Dubbo框架

1:簡介 Dubbo 是阿里巴巴公司開源的一個Java高性能優秀的服務框架 Apache Dubbo 是一款 RPC 服務開發框架,用于解決微服務架構下的服務治理與通信問題 這是Dubbo官網的介紹,下面是我對這dubbo的理解 首先介紹下什么是RPC: 常…