嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & H$ ^2 w$ l! g

) d' O+ i* |, bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) g0 x$ w8 z8 k8 }( f#include <unistd.h>: u* q+ G9 G1 j) K+ k$ \/ D
#include <sys/mman.h>9 @  e4 P. g* o
#include <sys/types.h>
: u# b# h) e4 Z8 ]/ z! w#include <fcntl.h>. Z/ _3 K0 w$ H' R% b
+ n/ a  C$ L( Z! Q9 @
#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 W; w9 x9 N! f4 F, o6 o+ x: }4 Y+ u
3 z* _+ E' l3 N+ u: j
typedef struct
' I( I' q2 S5 j, F: G7 x{) g  V! _6 D, p. R) Y& o) o/ a
        unsigned int a;
, T: D$ A) q- C$ ?$ Y& f3 ?        unsigned int b;
% B* j4 W: P/ Q1 b        unsigned int packet_cout;( N6 d3 r+ R+ x" C  a5 t( q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: D! l$ w1 m# t( G/ M2 k* r/ R6 Z  @) i% Z: |" Z( U. D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' T+ q5 q2 P5 O# Y0 o$ H
unsigned int count_copy = 0;! k( k- t5 j1 e/ n0 Q9 f1 r% ^
5 {/ q2 j3 M# L# X, I2 H8 ~
! @7 ]0 `; G& x
int main()5 U  O& f- [" @- [) n
{+ K) w/ ?( F# ~1 P+ S# u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 p" h8 v' q, K, ~. ?) W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 u4 E$ p0 {+ f6 y
- M; o2 p/ c3 F5 S3 y- n( T' o* ^
        while(1)( G+ }- b1 X3 @' }
        {
+ E; N4 C$ o7 g2 B4 X& z6 k                read_MSG_buffer(pshreRAM);: K. T" {1 @, K( u
        }                + K1 w4 B3 u( ?# r
}
+ e/ ]3 T1 y8 I2 p7 @& W# m% g! I9 V- {$ m  d4 u0 D3 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  I0 h7 k  w* v
{
1 j0 L7 R1 A' b9 y' o  Q' K        RX_MSG_PROTOCOL buf;
& f2 S; F- Q  D+ F- I8 F        6 K& `% X. a8 N' |/ Q
        buf.a = pshreRAM->a;' {/ A( f" C  x: l
        buf.b = pshreRAM->b;
. g; R+ @' l* m: N( D5 V; L7 h5 z        buf.packet_cout = pshreRAM->packet_cout;
: F9 o; |0 q% Z' y5 E& M& z- D% L        
! H' F. `5 ^4 k. Q! y        if(buf.packet_cout != count_copy)1 L5 {5 d: x/ }+ d+ ~
        {$ O) D7 z3 h& H: U1 Y" r
                printf("a is %d\n", buf.a);* X3 t( H; R$ Z& @# P4 G/ \# u2 j% V
                printf("b is %d\n", buf.b);
9 V% y. z( V4 f7 L                printf("count is %d\n", buf.packet_cout);5 T' f# ~$ U  h$ \6 S
                count_copy = buf.packet_cout;! ^& i1 F- g- T9 _7 i
        }
5 _' r2 p2 Y2 [, ?* u( q        else
4 M( Y: i7 m  y: q! h7 G        {) n1 h  B4 u7 p( J2 I1 v' {; G& K
                printf("No effective message!");
3 q+ \/ o- n: a( `$ C7 R        }
. B0 ?4 X% R5 r}$ w7 F# u6 Y; _7 J3 o1 P

4 d9 s5 _7 Z8 ~5 D* ~$ U# t1 S, K& B% l; \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 {0 e+ c- c) \, Q2 L
使用下面代码,对内存使用了mmap函数后:. A7 R% E, h' S) |. }6 u. G
#include <stdio.h>
! [3 `2 N8 A8 Y5 I#include <unistd.h>% U  J& a. G, m& Q% j, d
#include <sys/mman.h>2 Q# T: M% T7 e( J0 `
#include <sys/types.h>
3 M# S0 U+ z1 i) E$ K9 z; W#include <fcntl.h>5 j3 l9 H% N: ]' e, u

8 p- K* h5 r7 u/ G6 |: O( D! D#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 |- |/ g; ^. @; ~( D$ `% N#define SHAER_RAM_SIZE         (0x20000)   % S+ D) A+ r9 n
( d! F! [! N; {8 x3 c
typedef struct
& Q9 @7 i8 p5 F6 r9 E0 n/ g6 \& B{6 R% |6 u& i0 V0 |7 x* b
        unsigned int a;
! R, x: \" l* e        unsigned int b;
- P+ [$ [3 v* C( b+ W# u        unsigned int packet_cout;
  Q+ h% Y7 ]; X1 ?( W( t' f- H/ N8 w7 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% W; d( T$ W( n% e1 B
" W2 C4 O* m3 I* O1 y% s$ ]void read_MSG_buffer(int *baseaddr);' Z$ l3 S" X$ ~' W+ h. Q
unsigned int count_copy = 0;
0 e0 s2 V0 _# G$ `8 Z4 {, Y9 H! b6 O/ B
int main()
: k/ f! T6 r4 V{
3 d, z7 p. F, w6 Y        int fd;
+ O" ]9 S5 ^0 `9 D. s: L- b. b        int *mem = NULL;4 f; c' D  e/ R/ G) W. Q7 R( }5 R
9 R6 b" v2 P! f$ v, C- q: w
        if((fd = open("/dev/mem", O_RDWR)) <0)
! P/ P3 j3 G8 B  h  ]        {
* I' Z3 W1 F1 P; h                perror("open error");
) w( k3 A! H1 C% \5 x/ C                return -1;* K  d! C1 A2 |# ?0 w$ w' b# M
        }
, O7 {1 e  ^* L7 h8 u        
- d* X$ y8 E, r+ u        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) z% e7 w: @  {. e
4 S1 t) E  K& f+ d        while(1)6 c6 W, ~' Q& Y# ]
        {; X4 X4 C) Y& k8 {
                read_MSG_buffer(mem);- i0 O; R) ?3 b2 }1 w" Y+ ~
        }               
8 D: y9 W8 f; T1 ]: a! _/ w}9 F2 w3 U( A; K% w' D
, d4 H* q3 ~6 P' ?  O/ ~" J! _: ~
void read_MSG_buffer(int *baseaddr)4 ~$ y& Z0 ~: t( @
{, m9 Q5 d8 p- Y5 }+ u7 [) H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; H4 I4 p! u. @" s$ A2 ^6 q- ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ L7 b% g9 h1 Z

1 x. s& [5 r1 D( e. Z) j9 O        if(pshreRAM->packet_cout != count_copy)
6 u/ Q+ [& j3 t4 w% Z4 B* h        {
# u' F+ H1 k, J' z. [, F                printf("a is %d\n", pshreRAM->a);: u0 U" g1 s. B  N# \
                printf("b is %d\n", pshreRAM->b);
5 |- }( |) }8 R0 X) n' C) a$ w0 t                printf("count is %d\n", pshreRAM->packet_cout);
- b* f  @4 y/ D3 v; [9 q$ ]                count_copy = pshreRAM->packet_cout;! s* c  r. m4 v$ \- l- G
        }; o' T: x7 x1 o/ q
        else# _. }+ q, P* @5 ?$ m
        {4 d) U2 S( Y# e
                printf("No effective message!\n");
; Z% E5 w8 o5 A, P4 X* v; X        }
; k$ V4 M' ^0 D% s}
. Q7 q& o$ w$ d. ^- A- T
1 p: m2 o" l3 @0 y" {6 M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 X7 ]4 [& H- g5 e& I4 N! r6 A6 W- y5 x- A/ u

6 N4 V* l$ L% S" Y- n
3 @! V) B$ w# |: c" a4 ^$ U- k
5 s: z4 L8 v8 c  w* E9 k: ?




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