嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 }9 Z( T) _$ v* Y. O, u- c+ q" f4 S' R' R1 g0 m0 {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 v/ m: x' o" F$ E3 M$ h" t#include <unistd.h>
; {# {! u+ c: N* \$ o9 h' J#include <sys/mman.h>7 Q/ c1 T& d0 C
#include <sys/types.h>( A! a  |$ {0 |& f; x7 n! t4 R
#include <fcntl.h>
1 Q+ K2 q; i( i/ V! Q1 f+ f/ ^. {7 Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) L$ X# C. j% i* q  l

& C. i  z$ o8 Rtypedef struct9 T9 j( d. b5 s6 z- N
{  `# i& u+ m; U6 O( a
        unsigned int a;
) l6 t$ J' D$ X2 D        unsigned int b;
4 B8 r: l5 ]- I        unsigned int packet_cout;
: Q) O3 _, z- g/ i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% P& C1 C* _1 x! B: R; w! |, H( \' Q

* [. o8 A0 N$ h; }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ g0 Y$ a6 q. o: T+ y8 r$ b
unsigned int count_copy = 0;2 F9 v, j. @) k

6 E  x9 f& v4 G1 N8 a. u$ h& h) ~( X+ j5 J
int main()
. f. r" n4 |  ?3 \{6 T( Q( l! }4 V) {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 r' [/ u8 v: t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# S: ~$ R& Z4 {+ f) U% R
( a. v) g" \' ^( c2 F
        while(1)
" z$ S8 C! |) y0 t" _) W/ |        {- T: ~, G& |) i2 b
                read_MSG_buffer(pshreRAM);
, u5 s- P( ?/ U2 Q' A/ f2 J        }               
: ]1 n3 A' G# S}
. Q. c- Q9 q7 r6 E% ~( `% q3 `  \2 z4 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) z6 S  T' h; ?2 U{- G% |8 D/ h& f! d1 i( K& ~
        RX_MSG_PROTOCOL buf;
( @0 o/ F! r" o' `& G" a% _        
1 P. Z, X, w/ E5 _5 ]# p9 p        buf.a = pshreRAM->a;
% h( T1 A* s$ H$ G        buf.b = pshreRAM->b;/ F/ I( z, N. F8 {+ O8 ~; w6 k
        buf.packet_cout = pshreRAM->packet_cout;
4 {$ d5 Z/ [% |! G% H        ; N  S7 f: l% S1 Q' s
        if(buf.packet_cout != count_copy)
/ G* X2 b& O: j0 K5 z3 C7 ~) k. W; [        {
! O* P5 @( j) X                printf("a is %d\n", buf.a);# b" B6 Y7 y# t5 L+ I; [: V2 l
                printf("b is %d\n", buf.b);
4 R" N/ o5 {5 v$ A+ {9 t7 d' j                printf("count is %d\n", buf.packet_cout);
6 i; ]& F' D$ g/ {5 z* r% {                count_copy = buf.packet_cout;
# t: l* s3 x) R- `9 b1 w! E( |        }- `! q) `1 S; N+ o* j0 a% ?# ?
        else
( l8 r4 D7 m, l* j0 G5 m        {
8 \$ S2 r! H1 h                printf("No effective message!");; J, J& J( A: T  ?$ a
        }5 t& u; F2 [- ?0 @+ z; z
}
2 ?2 V5 Q7 L" f: O% W0 d8 i
. L$ e; |. S) n" G2 l
8 {0 F* N' f' i0 T  U; h5 H: o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 k, Z  n1 M& i" E6 r7 U) k使用下面代码,对内存使用了mmap函数后:
; |1 @1 v* w5 O; t& ]5 \#include <stdio.h>% B6 y# ]7 n& d
#include <unistd.h>7 T! [: K4 l0 x
#include <sys/mman.h>
* C: X& E; y5 F- }* e4 C( A% H#include <sys/types.h>. i# {+ o3 K0 S1 `+ T
#include <fcntl.h>
, H% y9 e! C- {* R# `) o9 T$ Q. u: s9 W( H
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. o6 U" \0 d$ z9 z- U0 I#define SHAER_RAM_SIZE         (0x20000)   
- a. C) i1 M3 ]* ?
: p$ J5 \1 |9 u! Atypedef struct
% ]& a1 L; r$ R$ W# u5 p{
6 n2 ^7 l8 \" `' T& f  P        unsigned int a;
5 z1 V, Y, i4 \5 f; e8 Y2 c; ?        unsigned int b;5 H& x  t( j- b2 M% V
        unsigned int packet_cout;
- S/ {5 u; H, J5 x* ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% B4 Q/ ~; I2 C& }

9 L! d7 z- L+ n9 S+ K, Pvoid read_MSG_buffer(int *baseaddr);
5 i: B, I' r1 d- [3 e2 nunsigned int count_copy = 0;
1 }0 w" ~4 f8 P! i$ f& n, P- _! T1 \+ y
int main()9 d8 c- Y( X3 C  q
{
; l$ E' _  q/ a& |7 b8 I2 _        int fd;
$ v9 a5 W' [* f7 M& X" ]1 q" J        int *mem = NULL;. A- J# E( p' G- I2 j+ X1 j
5 G/ E6 _4 f- x6 V  @
        if((fd = open("/dev/mem", O_RDWR)) <0)
  z4 H. O2 H  ~6 d5 |        {$ g' T; |9 e! j
                perror("open error");; a4 d# ?* x) |6 O
                return -1;
) a9 c" g4 i4 t( a% r- U2 V        }
: K7 c& f3 {' H& Y1 ]+ [  m        8 [+ y( b% ]! e0 I% M% ]+ p) _
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& ?  q# l" A* c/ }: Z8 A$ Q* [& P
' z4 k# E3 b. `+ d
        while(1)) m4 S7 U! ]0 f3 q# B% Y
        {
+ U( S- U+ F" T; p: S! H3 p                read_MSG_buffer(mem);, ^& q' r1 T- q! a8 E
        }                4 P0 Q: c) R6 `5 R' }) Y) C& `) F
}+ n' Q, M: t% K
) r) ]& H( X* t: P, Z. @
void read_MSG_buffer(int *baseaddr)
. V; Q, G6 D4 _  Q& r5 s6 J( O{7 _, `& ]! }7 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* W# `# S" F7 m8 f9 s
# R/ P8 ^! ]: r; v! B6 [0 ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 w9 M1 |. T0 A# y3 O
1 v7 B/ I9 K" i* I' O+ `9 L! \
        if(pshreRAM->packet_cout != count_copy)& F. ^. S- H: d) _8 P
        {
/ s4 B3 ]6 |3 t# `1 r& `                printf("a is %d\n", pshreRAM->a);
, b' r+ t; }$ L$ Y1 Q                printf("b is %d\n", pshreRAM->b);
( g; L* P3 |1 g                printf("count is %d\n", pshreRAM->packet_cout);
  X) i+ M! D. K" i                count_copy = pshreRAM->packet_cout;
/ d. j/ Y, E1 k6 f        }& p0 Y/ [' |8 p# L% G* P7 G0 h
        else- ]4 }9 b; {' y
        {
+ ^* D4 W. A# E/ O" u: n, _                printf("No effective message!\n");' r" b8 b# z) L9 v; o' i' w% t3 j! |
        }
8 P) L7 M- o6 c* K* [: {- c% B}8 K0 J7 C( u7 z

1 c% G; F% N* g# u/ S5 U5 d8 i没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 a3 n) b4 n* Q/ `, z5 ^- ^, Y$ O" |- Q0 Q1 P; S/ M, d
9 Y; H& w2 \( v5 F7 B
: _8 R0 {6 d7 q- {

% `$ k8 J0 o/ k% [5 i




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