久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3733|回復: 24
收起左側

C語言如何把一個超大數組賦值后存放到FLASH中?

  [復制鏈接]
ID:997026 發表于 2022-7-24 10:03 | 顯示全部樓層 |閱讀模式
我的FLASH空間比較大,有512K,RAM空間也比較大,接近200K,但是RAM由于還要做其他用途,所以現在需要把一個超大數組保存到FLASH中。
現在有一個超大數組:

uint16_t   databuffer[240][320],

這個數組有240x320=76800個元素,然后占用空間76800x16bit=153KB, 可謂是相當大了,我如何把這個大數組存放到FLASH中呢?

這么大的數組怎么給他賦初值?不可能用大括號的方式,databuffer[240][320]={0xFFFF, 0x32A3........},  7萬多個數據,寫到猴年馬月也寫不完啊。

如果我加關鍵字const uint16_t   databuffer[240][320] 的方式,可以讓他保存在FLASH中,但是沒法先賦初值,如果我用for循環賦值,倒是很快,可是就沒法加const保存到FLASH中了。

誰能解決這個矛盾?
回復

使用道具 舉報

ID:94031 發表于 2022-7-24 14:02 | 顯示全部樓層
編程時數組直接賦值放FLASH中。
回復

使用道具 舉報

ID:161164 發表于 2022-7-24 15:22 | 顯示全部樓層
你的7萬多個數據是有來源的吧?Excel?SQL?CSV?
利用這些來源生成一個
uint16_t code databuffer[240][320] = {......};儲存到DtatTable.h內就可以了
回復

使用道具 舉報

ID:997026 發表于 2022-7-24 17:13 | 顯示全部樓層
lkc8210 發表于 2022-7-24 15:22
你的7萬多個數據是有來源的吧?Excel?SQL?CSV?
利用這些來源生成一個
uint16_t code databuffer[240][ ...

沒有來源,,這些數據是LCD的顏色數據,平時我是用for循環直接賦值,賦值后直接使用。因為顏色數據我要用的時候直接for循環賦值就可以了,所以沒必要整成一個excel. 所以這算不算C語言的一個缺陷,大數組的初始化非常不方便,,,,,,只能直接大括號內寫。。。
回復

使用道具 舉報

ID:997026 發表于 2022-7-24 17:15 | 顯示全部樓層
xuyaqi 發表于 2022-7-24 14:02
編程時數組直接賦值放FLASH中。

我這個大數組是為了LCD初始化的時候,DMA直接從數據讀數據刷屏幕,,,因為這些數據基本不涉及到改動,所以考慮放FLASH中,請問編程時直接賦值怎么能放FLASH中?7萬多個數據要一個一個寫嗎?
回復

使用道具 舉報

ID:401564 發表于 2022-7-24 21:17 | 顯示全部樓層
能用for循環直接賦值,這個數據是固定的嗎?或者是有規律的?不知道這是什么意思,沒有用過LCD不知道
在FLASH開辟某個地址,比如0000H存放一個標志位
程序啟動先讀取這個標志位,如果沒有標志,就用for循環寫入FLASH,寫完之后置位標志位并保存,這樣,這你所謂的7萬多個數據就保存在FLASH了
如果已經標志了,就不用寫入了,跳過寫入這一步
下一步就是讀取FLASH中的數據,初始化LCD
這樣就達到了每次開機都能通過讀取FLASH來完成初始化了
不知道這行不行得通
回復

使用道具 舉報

ID:883242 發表于 2022-7-24 22:26 | 顯示全部樓層
7萬個數據怎么可能沒有來源?總不能是隨手瞎寫的吧?
回復

使用道具 舉報

ID:997026 發表于 2022-7-24 23:21 | 顯示全部樓層
Hephaestus 發表于 2022-7-24 22:26
7萬個數據怎么可能沒有來源?總不能是隨手瞎寫的吧?

我說的沒有來源指的是沒有把這7萬多個數據匯總成一個EXCEL表格隨時調用,我是這么用的,我現在的LCD是320x240的分辨率,所以像素是320x240=76800個,用的是RGB565顏色,所以一個像素需要用16bit的數據刷顏色,這個數據量太大,只能用DMA去連續搬運同一個顏色,比如這個顏色是0xFFFF, 所以我的用法是,

for(i=0; i<240; i++)
{
    for(j=0; j<320; j++)
    {
        databuffer[ i][j]=0xFFFF;
  }
}

//然后用DMA搬運
DMA_Senddata16(&databuffer[0][0], 76800);


所以用法很簡單,只是for循環把一個顏色數據賦值給大數組,然后DMA根據數組地址連續搬運。
所以沒什么來源,只是賦值而已。
回復

使用道具 舉報

ID:997026 發表于 2022-7-24 23:23 | 顯示全部樓層
Y_G_G 發表于 2022-7-24 21:17
能用for循環直接賦值,這個數據是固定的嗎?或者是有規律的?不知道這是什么意思,沒有用過LCD不知道
在FLASH ...

數據是固定的,就是LCD的顏色數據,也就是一個RGB565顏色,16bit,2個字節,比如OXFFFF,就是要把這個0XFFFF寫入到這個大數組,簡單說就是寫76800次0XFFFF。
這樣做主要是為了DMA從數組搬運顏色刷整個屏幕,這樣的方法速度最快。

你這個方法我也想過,目前看來,好像也沒別的方法了。
回復

使用道具 舉報

ID:997026 發表于 2022-7-24 23:33 | 顯示全部樓層
Hephaestus 發表于 2022-7-24 22:26
7萬個數據怎么可能沒有來源?總不能是隨手瞎寫的吧?

換句話說,如果有來源,比如這7萬多個數據都整理好了,那我也不來這里提問了,我直接copy到我的代碼里就好了。現在是沒有來源,而且我這個數據是固定的一個值,因為這是刷LCD的顏色值作為全屏畫布用,不是你想的那種整理好的數據,顏色值就是一個固定值,我要刷什么顏色就賦什么值到大數組,所以用for循環就好了。
回復

使用道具 舉報

ID:624769 發表于 2022-7-25 00:03 | 顯示全部樓層
hxdby 發表于 2022-7-24 23:23
數據是固定的,就是LCD的顏色數據,也就是一個RGB565顏色,16bit,2個字節,比如OXFFFF,就是要把這個0XF ...

所以,為什么一定要DMA搬運數組呢? 直接刷76800次不比從數組搬運更快么? 中斷里做一個刷屏標志,做一個底色變量,以及計數,只要刷屏標志被置位,就不停的刷指定的底色,直到計數滿76800次結束,然后清刷屏標志,感覺這樣比搬運數組到DMA,然后DMA自動刷屏效率要高啊。
回復

使用道具 舉報

ID:401564 發表于 2022-7-25 00:58 | 顯示全部樓層
188610329 發表于 2022-7-25 00:03
所以,為什么一定要DMA搬運數組呢? 直接刷76800次不比從數組搬運更快么? 中斷里做一個刷屏標志,做一個 ...

DMA不需要做什么的呀,設定好初始化就可以了,SPI的DMA操作是不用占用主程序時間的
肯定要快一點了
直接寫入76800次,不管是用中斷還是等待,每次寫入完成,你就得清除中斷標志位,中斷返回,大概要1uS吧
那76800次就要多花76800uS=76.8mS
DMA就不需要多花這76.8mS了,程序只要處理DMA傳輸完成之后的幾個操作而已
回復

使用道具 舉報

ID:997026 發表于 2022-7-25 01:25 | 顯示全部樓層
188610329 發表于 2022-7-25 00:03
所以,為什么一定要DMA搬運數組呢? 直接刷76800次不比從數組搬運更快么? 中斷里做一個刷屏標志,做一個 ...

你這種方法在實際LCD刷屏中是行不通的,主要是沒考慮SPI的速率,SPI的頻率一般很低,如果用你這種方法,SPI每次只能傳輸一幀數據,每傳輸一幀需要拉低拉高片選一次,這中間拉低拉高片選的時間加上SPI的低速都夠你受的了,而DMA的好處是只需拉低一次片選,中間可以靠DMA連續無停頓的搬運76800次,就像打%%%一樣的,搬完了拉高片選結束。當然前提是SPI的速度不能太低,太低了,DMA也沒用,但如果不用DMA,大概率直接刷屏的速度是不可能提上來的。我板子都做出來了,現在DMA刷屏速度杠杠的
回復

使用道具 舉報

ID:1040502 發表于 2022-7-25 18:11 | 顯示全部樓層
兩個問題:
1、保存到flash
這位問題看起來你已經解決了,const定義就可以了
2、賦初始值
為啥非得要C去給初始值啊,你用腳本寫一個初值不就行了么?很快,很簡單,perl,python都可以啊
回復

使用道具 舉報

ID:248705 發表于 2022-7-27 10:46 | 顯示全部樓層
大兄弟不會是想用flash當顯存叭,不可以哦
回復

使用道具 舉報

ID:99525 發表于 2022-7-27 12:54 | 顯示全部樓層
我怎么感覺你是想要存一副圖片呢
回復

使用道具 舉報

ID:123289 發表于 2022-7-28 10:19 | 顯示全部樓層
主導思想不合理。方針錯了,方法就沒有意義了。
回復

使用道具 舉報

ID:824490 發表于 2022-7-28 11:28 | 顯示全部樓層
關注一下!看看樓主是如何解決這個問題的。
回復

使用道具 舉報

ID:58930 發表于 2022-7-28 11:50 | 顯示全部樓層
那就是 flash編程啊,需要單獨的flash地址不要下載程序的地址和這個沖突,單獨的函數,程序開始的時候運行,把數組里面的數據進行編程,再進行讀取。
回復

使用道具 舉報

ID:386442 發表于 2022-7-28 17:03 | 顯示全部樓層
flash模擬eeprom的方法,先給扇區擦除在寫入數據就可以實現數據修改,還可以實現掉電保存~
回復

使用道具 舉報

ID:73992 發表于 2022-7-28 22:08 | 顯示全部樓層
hxdby 發表于 2022-7-24 23:33
換句話說,如果有來源,比如這7萬多個數據都整理好了,那我也不來這里提問了,我直接copy到我的代碼里就 ...

按你這么說,就不需要寫數據到falsh。程序直接現場給顯示屏賦值就可以了,你想用什么顏色就附什么值,不是更方便嗎
回復

使用道具 舉報

ID:997026 發表于 2022-7-29 00:12 | 顯示全部樓層
lyonkon 發表于 2022-7-28 22:08
按你這么說,就不需要寫數據到falsh。程序直接現場給顯示屏賦值就可以了,你想用什么顏色就附什么值,不 ...

說的沒錯,但是你沒看我前面的描述,我是想節省我的RAM,因為不寫到flash的話,定義的大數組是占用RAM的,而且我的RAM還有其他用途,不能占用太多,所以考慮把他放到flash里
回復

使用道具 舉報

ID:997026 發表于 2022-7-29 00:14 | 顯示全部樓層
yzwzfyz 發表于 2022-7-28 10:19
主導思想不合理。方針錯了,方法就沒有意義了。

不明白你在說什么?你可能沒有真正理解我在做什么?給LCD刷屏的顏色數據我想問問,你是怎么處理的?要放在哪里?flash還是RAM?怎么刷?總歸要有地方放吧?不明白你這莫名其妙的一句話什么意思,你有好的思想你提出來大家討論呀
回復

使用道具 舉報

ID:997026 發表于 2022-7-29 00:18 | 顯示全部樓層
祖國的花朵 發表于 2022-7-27 10:46
大兄弟不會是想用flash當顯存叭,不可以哦

顯存我一般用RAM來做,你用flash當顯存?看來你還得努力啊
回復

使用道具 舉報

ID:401564 發表于 2022-7-29 07:00 | 顯示全部樓層
lyonkon 發表于 2022-7-28 22:08
按你這么說,就不需要寫數據到falsh。程序直接現場給顯示屏賦值就可以了,你想用什么顏色就附什么值,不 ...

現場用SPI操作是不是還得拉高拉低CS線的?
是不是還來  SPI_Write(數據);那么一下呢?
這一來一去的,7萬多次,那得多花多少時間出來呢?
用Flash通過DMA寫入,基本就是什么事都不用干,主程序有很多時間去執行其它任務的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线看a | 久久不射电影网 | 美女在线视频一区二区三区 | 黄色毛片免费 | 日本电影韩国电影免费观看 | 欧美美乳 | 亚洲激情在线观看 | 国产1区2区| 天天操网| 亚洲精品亚洲人成人网 | 成人动漫视频网站 | 亚洲国产一区二区视频 | 一级片视频免费 | 深夜福利影院 | 亚洲一区在线播放 | 欧美一区免费 | 成人免费视频网站在线观看 | 精品国产精品国产偷麻豆 | 亚洲综合视频 | 蜜臀网 | 久久精品欧美一区二区三区不卡 | 国产二区精品视频 | 在线一级片 | 日本色综合| 久久99精品久久久久久秒播九色 | 国产区精品 | 精品亚洲一区二区三区四区五区 | 精品国产aⅴ | 91网站在线观看视频 | 日本精品视频 | 精品一区二区av | 欧美一级淫片免费视频黄 | 激情久久久久 | 国产操操操 | 久久精点视频 | 天堂在线www | 亚洲国产精品久久久 | 亚洲欧美中文字幕在线观看 | 亚洲中午字幕 | 欧美va大片 | 激情亚洲 |