嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ D! W3 k, M4 d1 g  V

4 c5 z4 P. o1 k- b% pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 ]3 W: x3 s4 ^" Y9 s0 N/ L
#include <unistd.h>
6 ^9 A0 o* s' E9 r& v) I#include <sys/mman.h>
. c0 l. h9 A' }; Y0 v#include <sys/types.h>
0 T5 ?2 l+ {) y2 m3 j#include <fcntl.h>) ]7 K+ d* p& @) }" \2 d
0 w- x: ]+ y* P9 S" A" W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + f5 M% ^) P- m' q- ^

  A# u; |5 x1 o5 wtypedef struct
0 |5 j) f& \, B6 b% ~: n{
3 ^3 z* I% A# C. O# R) \        unsigned int a;, V) O2 N7 W" y* x; x
        unsigned int b;
" \! r  u% M2 b. ?  D        unsigned int packet_cout;- O  |& J7 a2 o1 @( D; z3 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' j* [2 d2 ]1 X# z8 M, M+ q7 m  o# W- [& ]5 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ }$ f( Y6 h5 x4 zunsigned int count_copy = 0;
3 j% l( ?' F( y
/ d: L% {, |  _- J
& N: x. A7 Q. \- O) L( l) Oint main()  C; v/ N9 H' n/ f; O8 B$ [& L& L
{
( t" l, Q  Q" d; I/ L* l: K        pRX_MSG_PROTOCOL pshreRAM = NULL;
, a0 T  k* w9 v1 k; o" A7 U3 Z- T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 R. ~  E. ?$ l! F9 ?8 V9 E

& k8 G9 s4 I9 ?9 q- n        while(1)9 F! u/ W6 C4 f% X
        {
% _& i) M! D9 H3 ]                read_MSG_buffer(pshreRAM);
$ t/ f0 i- B, k1 I0 k        }               
- e% X" B) C7 c  r. t8 p! _}, M/ E* P$ B* [

4 p0 r# L" m+ H2 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  b0 _" ^0 N6 [1 [) f, P{
5 P, E, O) X" q4 N$ |        RX_MSG_PROTOCOL buf;5 w% b' U9 i5 `( ?' y
        
5 S$ z6 c+ K' y7 Y        buf.a = pshreRAM->a;
' U3 J2 r) m' @1 p0 {# k        buf.b = pshreRAM->b;
# R0 d5 O, l9 v3 n' j3 Z        buf.packet_cout = pshreRAM->packet_cout;1 O; A$ {; W0 q2 D- u
        
  ~) h; ]! N7 ~* K        if(buf.packet_cout != count_copy)
( r0 v1 @3 r5 d# {0 N4 u0 v        {: E2 a2 B! R& ^2 w; i, M  W
                printf("a is %d\n", buf.a);
' Y! x- n" ]  j1 u& j. @                printf("b is %d\n", buf.b);* ]8 s( h* j8 ]( j3 R! {
                printf("count is %d\n", buf.packet_cout);
1 M5 {) ]! w* v! y7 n                count_copy = buf.packet_cout;
) H; S7 C5 a3 p7 z$ @        }6 I. p% {+ o  i8 R0 V" Q* G1 p
        else
, C  z, \4 `* m; M$ l5 s; U        {
1 j# k- P8 [. ]0 a                printf("No effective message!");
0 Y: p) e9 L% u! N) ], _        }2 }- |; B9 }* {) }- S5 a0 k+ A& D: {
}( u0 k, V3 z/ ?3 d4 \' L

* j. }" R( ^' J9 Q9 y# h2 ?
6 D. O) A3 e5 u( c8 J& i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 @" X$ z  L2 W. S4 _4 A0 \. I1 J使用下面代码,对内存使用了mmap函数后:
4 H' V' {' I* N#include <stdio.h>
9 w# \& `3 O5 P/ }# C% U  h9 n6 z#include <unistd.h>& B9 t! v; N. }1 f) _
#include <sys/mman.h>
: f, C% _/ T; f( |% `#include <sys/types.h>
4 F% o" J) y! o- D2 N0 _#include <fcntl.h>
% N  n+ _! s6 m+ B! u) i1 d
. M' I1 q8 ^! P( `#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 Y- w; M7 v2 C! o4 J% u* \#define SHAER_RAM_SIZE         (0x20000)   0 e0 X4 y+ u$ F$ s8 N
' M/ Z8 N! M0 S
typedef struct7 x; P) s# H0 z7 j8 z
{6 w/ X5 n9 `* q
        unsigned int a;. ~; Q3 Y  {6 w1 S' j" S
        unsigned int b;2 d* U0 q9 u$ Z+ q$ s2 H
        unsigned int packet_cout;5 e' Y" t, j! O3 t7 k" X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 F# f) V5 F, ~9 S/ A# x4 t) y) y4 {9 {1 Z7 w/ h0 l$ N4 A5 Z. F
void read_MSG_buffer(int *baseaddr);
! F! Z# V7 E; T7 c- R+ y7 w) g3 d2 j5 ]unsigned int count_copy = 0;
9 \. b$ [( p& w+ `/ X  y: K8 T- V# R* a" R% \) j
int main()
) U7 n& _' t  R, d8 _. w  Q. ]{
9 K1 R! o5 L) t* f2 u        int fd;
! B0 L0 X: Z: v4 g! z; B9 l+ L        int *mem = NULL;# @/ e" W/ h* I* l2 N

1 u- i9 ?/ I) V4 l2 v        if((fd = open("/dev/mem", O_RDWR)) <0): {$ @$ h: u0 {* z. z
        {, q/ \. R) W2 L+ [! b. @/ ~
                perror("open error");  C+ e- [- w9 j$ g# o
                return -1;
  n( B# w! U, }5 W" T0 J& D        }$ H* ~( B5 U5 S- U/ |# D6 p
        . U, }- E: M& l5 U( t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% Z, u# j" d1 N6 K5 s( w

3 \" P* U& M* Q1 V1 x        while(1)
3 I2 o" O4 z1 K; S        {
# N& I7 z: y" H* G/ t. T6 T* {; s                read_MSG_buffer(mem);
( X- @% e3 x/ t! c' G, e- k        }                . z% j) U# a7 H( \) ~
}; S# @/ M/ t  c0 b& G% ]
+ O& X9 D6 S/ z' @& o, s1 S; Y! \
void read_MSG_buffer(int *baseaddr)
" E- @& s( E# w9 q- [{3 N# s. w3 S1 D  D
        pRX_MSG_PROTOCOL pshreRAM = NULL;. B" j. [% a/ |9 t3 V

$ @/ V. }$ I9 R& D( Q2 u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 ]; R# Q+ m: U* T& r
+ m& H9 Y4 O% M- r: s. z$ K' V4 V$ U        if(pshreRAM->packet_cout != count_copy)
" D5 j, K/ p5 P        {
& a' E$ m$ J5 B1 A$ \0 f                printf("a is %d\n", pshreRAM->a);
2 T* |: Q( i) p- ?1 Z' Q                printf("b is %d\n", pshreRAM->b);; Z# p; `( r. U+ N" r# ]
                printf("count is %d\n", pshreRAM->packet_cout);
# e, o( q/ ]- C$ u4 m( }                count_copy = pshreRAM->packet_cout;
1 C) @, B+ i! |- ]' x( ^0 h        }
, R' q0 u9 G) C- v# f  }# B+ h        else
; v4 m! `( G: G5 e" Y( t9 w        {
4 {( Z6 a# G! j; R, V5 d                printf("No effective message!\n");
0 p  R7 c- |) G        }& r$ C% j9 B2 \
}7 `0 V9 f6 o7 I# t+ r8 K7 ]: S

6 I8 |' {3 O5 _  B) ~( L8 }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 I0 `: G! d5 d5 \

- `- }8 J4 c1 Y0 z* ]. a& R3 k& [3 v( {9 i0 U& m1 n$ N  Q3 F+ R# I8 g
3 C5 M# B3 X# ^+ Z2 Z+ Z; s. n. u
. n! [2 b" [9 S$ m! L- M% w8 y





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4