令人极度困惑的指针问题,求大神帮忙看看

2020-1-11 11:23 [复制链接] 3 82

15金钱
本帖最后由 朋友,你好 于 2020-1-11 12:08 编辑 1 r! q2 f9 B9 z1 @
  1. void save_data(uint8_t* msg, uint16_t size)
    0 I6 l8 O* K, }- H% [7 P
  2. {            % E; w# Y9 i. d8 I  c( T1 Q
  3.     uint32_t len = 8192;
    2 t! M1 Y3 t: q. l2 F0 v) p
  4.     uint8_t data[80];
    ' Y! p/ {: R: [. w% e
  5.     uint8_t i = 0;- s/ x" d( K* [+ E7 o  F
  6.     while(len < 20400)
    1 V5 i# ]! }$ e3 s; h* t: @
  7.     {( s8 P" C6 v: A7 W  U- C4 [
  8.         nwy_flash_read(len, data, 80);0 }2 j8 G. h7 z# G# a* n
  9.         rt_thread_delay(1);9 B' w  r3 p0 f) j6 U+ l
  10.         for(i=0; i<77;), u$ K0 i1 G6 @
  11.         {
    " @2 w$ h" R4 ?$ j6 C6 \9 P
  12.             rt_kprintf("i = %d,data = %x,len = %d\n",i, data[i],len);
    " ^* ?; l! p( Y, S( I; q" E
  13.             if(*(uint16_t*)(&data[i]) == 0xdaeb)+ `: ]' W: r8 R1 p7 v
  14.             {; k9 f7 |+ [" |2 d' h( H6 v* g& o+ u
  15.                 rt_kprintf("data = UPLOAD_DATA_FLAG\n");
    ) {5 l* F$ L7 ^% h- V
  16.                 i += 5+(data[i+3]<<8|data[i+4]);
    ( `5 Q* C5 a* j. c& K$ [
  17.             }5 z8 f4 X; H3 X) ^+ s
  18.             else if(*(uint32_t*)(&data[i]) == 0xffffffff)1 Y& F1 F, C+ n3 x7 c+ q- U7 n
  19.             {
    " k4 f1 {4 ?: n1 t+ C0 n6 L; N
  20.                 rt_kprintf("data = %x\n", data[i]);               ; F2 R$ h, ?8 P! f" s" J
  21.                 rt_memset(data, 0, 80);
    3 I8 D# g' f, J. A/ v
  22.                 *(uint16_t*)data = UPLOAD_DATA_FLAG;# c" A. O7 b8 D/ c# d9 ~# E
  23.                 data[2] = 1;- W4 w! Q3 _7 x
  24.                 data[3] = size>>8;
    ! m9 Y' Y  t" q+ ]% N( }) o
  25.                 data[4] = size;
    / I7 w: U" z3 ^5 G; |5 m% i2 S6 r
  26.                
    $ V4 m# Z9 m; S1 U
  27.                 rt_memcpy(&data[5], msg, size);
    1 R' @# ~  V3 z& |# X( c! R$ |; {
  28.                 SPI_W25QXX_Write_NoCheck(data, len+i, 5+size);
    + v3 I5 ]$ s3 H4 d
  29.                 return;               4 D, k' v; d; O% O
  30.             }3 Q. L! N2 L, R
  31.             else( m5 \0 R% |, f: j# C& q$ L
  32.             {. v9 z, c' p  i5 W+ d/ |
  33.                 i++;; r5 R' s% z; i* \) z
  34.             }
    . O" T8 Z0 Q9 F" G) G1 S$ D
  35.                 0 C$ @; C# {* n4 x( h
  36.         }
    # r! u1 t6 ~9 B* }6 G, q) `
  37.         len += 80;. P% Y$ w% A/ {6 k! i% h; T
  38.     }/ Z) q1 W# z$ B, h  x5 H1 C
  39.     if(len >= 20400)
    $ P* ^0 Y! _, e; F1 d- h
  40.     {5 r1 y9 Z7 J' T9 r: N, }
  41.         *(uint16_t*)data = UPLOAD_DATA_FLAG;
    9 \& @& l  h$ N
  42.         data[2] = 1;8 I4 ]. F/ a. E2 n
  43.         data[3] = size>>8;
    . p7 @  O" `, f# ]: h9 |# v  U
  44.         data[4] = size;
    2 v4 X6 o8 s+ B( Z1 Z5 v
  45.        6 V6 ?2 f9 C) @" Q: E
  46.         rt_memcpy(&data[5], msg, size);
    7 l! W& X# [! O' o1 ]! s
  47.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR, data, 5+size);
    - W4 N0 F! g/ E+ Y0 X1 t( u
  48.         rt_memset(data, 0xff, 1);. S% H& g) J- g4 Y4 a
  49.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR+4096, data, 1);
    ( a: M+ v  W- k2 j; h0 V9 l
  50.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR+8192, data, 1);; H/ k) J' p; L9 x' B
  51.     }     / s9 V% m4 b; b* v0 G1 _. \
  52. }
复制代码
$ n% j2 q3 U, ^; ?5 M; f8 s

. @! ^& t4 G" |, [" e6 ~) C: Y2 d运行结果如下:
8 @+ R& |0 @6 a, `) c6 C
9 j1 L# w# @# K! R
% U! O) ?, {2 m+ y) r! T
% E6 b% N  u! b& E# |- f: Hi = 0,data = eb,len = 8192
0 l& q0 Q6 w: w3 pdata = UPLOAD_DATA_FLAG/ q0 @( t$ z- k
i = 48,data = eb,len = 8192
+ X1 G. M; N" H8 cdata = UPLOAD_DATA_FLAG. h9 T$ ^( w  o5 }! R
i = 0,data = 0,len = 82720 F8 P& _* N5 Z# }, M
psr: 0x01000000
9 c) h8 v1 ?7 x3 s2 {  X0 v pc: 0x08013d24, n* p% E. d# _& J3 x! M
lr: 0x08017c476 P" c, N2 U" l* t( E3 m2 k
r12: 0x00000000# p! f9 H! M8 ~- s; w! i
r03: 0x08013ce3
' M! O, V- e$ I' p9 @4 Z2 qr02: 0x400138007 w, ?  [8 @' Q" a6 V0 K
r01: 0x00000000" x: J5 v) ]2 O# P% P% e2 K
r00: 0x2000564f
, L; O! E) D( s  b+ W. `+ ?3 [: U; ihard fault on thread: UploadData
8 }& ^+ _, [! O2 p# }8 Vthread                           pri  status      sp     stack size max used left tick  error' O- v$ P6 d1 E' ~
-------------------------------- ---  ------- ---------- ----------  ------  ---------- ---3 k/ ^) K$ ^) C: E1 E% C$ m
at_clnt0                           9  suspend 0x00000098 0x00000600    35%   0x00000005 0000 }; l- e+ o2 `  K
UploadData                        10  running 0x00000164 0x00001400    36%   0x0000000a 000; ?' f! {% L9 a, J
tshell                            10  suspend 0x0000007c 0x00000800    07%   0x0000000a 000
+ L& m1 R$ L5 \tidle0                            31  ready   0x00000054 0x00000100    32%   0x00000019 000  F8 G  d- R: v, p/ L) P1 Z7 _  T
timer                              4  suspend 0x0000005c 0x00000180    23%   0x00000009 000
' X5 H4 [5 V( K# Z7 X# p9 J5 Q! v4 v. F0 A0 ?, U8 V- m
当把程序改成如下形式之后,就没问题了,可以正常运行。. F5 U$ |6 c; Q; y! a; e  X
7 V& ]4 r$ A/ n# r* [8 ^( s
  1. void save_data(uint8_t* msg, uint16_t size)
    & }& s7 k. W7 [
  2. {            
    ; w, b5 R0 Z2 r2 V- R4 O
  3.     uint32_t len = 8192;/ {$ t, ?* J' e8 S( U( k6 ?# K
  4.     uint8_t data[80];
    7 N5 p- o# A6 H# f7 B' _
  5.     volatile uint8_t i = 0;! a2 m/ |: X, p, Y
  6.     while(len < 20400)& T+ \$ ?' `0 s: W' _) b( H
  7.     {
    2 G4 f& x5 E8 i. n: ~7 ?( q. J
  8.         nwy_flash_read(len, data, 80);9 ~4 Z! s! S' v* j/ z& ?) N
  9.         rt_thread_delay(1);3 o9 S; L7 |: j$ m+ {4 n4 E
  10.         for(i=0; i<77;)
    2 J# X2 m2 ?/ W0 J0 u2 \4 X
  11.         {4 D; b: t& G1 H6 F+ t
  12. //            if(*(uint16_t*)(&data[i]) == 0xdaeb)3 r: ^' b, _4 u9 c1 }4 r3 ]8 G/ D4 W
  13.             if((data[i] == 0xeb) && (data[i+1] == 0xda)), F) I- f  S1 U: G
  14.             {
    0 Y0 J5 m7 L, e/ r! m7 k3 F
  15.                 i += 5+(data[i+3]<<8|data[i+4]);              
      j9 X1 R. M: w" G, D) r
  16.             }                                 
    - a9 g+ K+ W7 Q5 p0 q) W# e/ Q
  17. //            else if(*(uint32_t*)(&data[i]) == 0xffffffff)
    # }+ Y4 F6 [9 y/ \0 O, r
  18.             else if((data[i] == 0xff) && (data[i+1] == 0xff) && (data[i+2] == 0xff) && (data[i+3] == 0xff))
    5 D9 y( j1 L/ d( Z+ R0 ^6 F
  19.             {               6 v7 ?( q" v1 x0 _$ B5 c6 A- y. b& E
  20.                 *(uint16_t*)data = UPLOAD_DATA_FLAG;% V+ G7 g: H) n! K" Y
  21.                 data[2] = 1;% A  n6 a- s' X1 q; y3 i
  22.                 data[3] = size>>8;+ ~  [* \1 T; j& y' m$ u
  23.                 data[4] = size;! I( W  i. l7 d  O+ t
  24.                
    - P$ i) M5 g% {. m7 w
  25.                 rt_memcpy(&data[5], msg, size);
    * ~2 `8 y+ n% h+ s. f" h2 O/ k
  26.                 SPI_W25QXX_Write_NoCheck(data, len+i, 5+size);
    . i: u- n0 X+ S3 v' t
  27.                 return;               
    ) ]0 D' R! l( e! _; Q
  28.             }2 j7 H$ M' y- t# r; `2 b5 [9 b, I
  29.             else
    % A% }; L7 ]( L5 w( T; Z, p
  30.             {
    " k, w- g. L( v- |
  31.                 i++;
    , e# r0 n# L1 ?$ L' K- U7 j
  32.             }               
    8 _; t% o/ |1 O
  33.         }
    ' J. a# U3 D7 a% g
  34.         len += 80;
    * k& ?' P$ d- t. u- \- K+ U
  35.     }6 b* j4 e$ c$ k& h1 `" b" y, i
  36.     if(len >= 20400)
    & x& J: m) W5 S& T
  37.     {
      N8 U: W, ^8 S9 T* ^7 ?" T8 N
  38.         *(uint16_t*)data = UPLOAD_DATA_FLAG;6 P' b7 v* |# s$ z
  39.         data[2] = 1;
    ( \% u9 f4 O4 z' [4 _
  40.         data[3] = size>>8;5 S, V3 F5 R3 m5 [. e* D$ Z
  41.         data[4] = size;
    * k& f* v5 l. i- ]( F  R% G. h! ^
  42.       
    / R) r' C7 O3 J2 D
  43.         rt_memcpy(&data[5], msg, size);3 k% E+ g4 U7 f
  44.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR, data, 5+size);( _! `9 d. o0 {; o: M& U* p
  45.         rt_memset(data, 0xff, 1);
    / \# \+ g% A% j# [& {6 q* O
  46.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR+4096, data, 1);
    2 f2 ]* D) h8 K0 Z: A; r' M) ^$ @
  47.         nwy_flash_write(FLASH_UPLOAD_DATA_ADDR+8192, data, 1);' c1 A3 e9 _- N0 K0 k. ?
  48.     }     
    1 X# g6 c( N* _9 Q6 r5 @
  49. }
    ) B  z& p6 r3 o. @
复制代码
求解。。。
/ h2 y( p' o" I0 g# A5 T7 k" e3 g1 S4 m
2 M& ]1 H0 c: N, }

0 z  h7 c3 u* [. ^6 V
$ t& i8 H: g+ W$ g
: b9 _" \( [$ y
' a* r. U3 `. v3 k) ^* P# E

最佳答案

查看完整内容

data地址未4字节对齐的原因,这么定义data就可以了,rt_uint32_t data[80/sizeof(rt_uint32_t)]
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2020-1-11 11:23:56 来自手机 | 显示全部楼层
data地址未4字节对齐的原因,这么定义data就可以了,rt_uint32_t data[80/sizeof(rt_uint32_t)]
使用道具 举报 回复
发表于 2020-1-11 11:28:49 | 显示全部楼层
重点就是后面那个程序被屏蔽替换的那两行代码,哪位大佬给解释一下,为啥这样写会有问题。。。
使用道具 举报 回复
发表于 2020-1-11 15:35:51 来自手机 | 显示全部楼层
data地址如果不是4字节对齐时,将其地址强制转换成32位指针进行读写就会引发ARM硬件异常
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表