嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ]! `! e, j2 n. c$ u* Z4 D5 l9 W1 f7 e9 N( T3 E* W( O  [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 F2 o! f% e4 ?6 v' j  |#include <unistd.h>
4 ^9 U1 H6 b" ?) h$ q/ d#include <sys/mman.h>
) |, V  E6 Q0 ]& n#include <sys/types.h>& e3 X" `6 q/ f- a1 G  @
#include <fcntl.h>
' ]: V5 M0 Y+ Z& O6 t* V0 ?: w8 h5 y' m. x# C! _7 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % S8 p1 l* |" t& i+ g& F1 u

$ _1 {" I. C8 V0 y3 Gtypedef struct
# |6 W  L, @9 f( B0 D, I! H{
  j4 u$ N0 e: [& Y3 C        unsigned int a;
+ J- F1 A% ^( ?7 w' {* X        unsigned int b;6 u* K9 r6 P" Z, f
        unsigned int packet_cout;, Z$ A* n8 o% e1 w. S- R2 i6 A  ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) ~) V( l+ }3 a! L

$ ^' a4 \5 @' i: \- Y& b5 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 v. k$ }2 U2 d. l9 D
unsigned int count_copy = 0;
2 O. o2 w  V! ^7 ], U2 R- @5 h3 [) q# q& J  A+ U: r! n0 d) n
  A  P- M- D) ]7 v
int main()
& u% E* P+ b* r. Q, b( j{0 Q) Y) h- h" S9 t4 H5 `. L" ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;% o: B4 H" m0 b7 k( q) R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 v; T6 W; a) |, z( ], p. D

/ h& b  C: c8 n4 r        while(1)* }, p; m) @' b  F1 g/ _
        {
) o: N( ^. F7 y0 c2 y( d, w                read_MSG_buffer(pshreRAM);
7 E3 D: @2 F, R0 R- E7 z% \8 P        }               
# b+ ~7 Y, E" [% c: K6 [}: e% X8 f- \4 g% {3 {9 w9 p

: S6 v# L+ ^! Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ Y3 \# r' g, a5 A4 k{4 U; [) N$ ]) P
        RX_MSG_PROTOCOL buf;
9 v! `) l8 ?! C2 X: E) c$ {6 W- R        
% F% K! y7 A* U; _. \$ W        buf.a = pshreRAM->a;' X, @% y6 B: g4 u% i
        buf.b = pshreRAM->b;
" v9 @- B4 d6 D1 Q# i8 y        buf.packet_cout = pshreRAM->packet_cout;
4 @' W; S  ~* D5 L2 U, S        
9 Z4 J3 y, A$ _6 k        if(buf.packet_cout != count_copy)
0 [0 P8 z# l9 W" p$ F5 r        {
1 d7 p: r+ W' X9 h, f* u* @) @                printf("a is %d\n", buf.a);( z8 f$ s1 |0 T. _/ {2 f: @7 g
                printf("b is %d\n", buf.b);' I( e2 T* h3 ^# z# g- Q
                printf("count is %d\n", buf.packet_cout);0 \; E1 }( q4 T
                count_copy = buf.packet_cout;4 k6 c' C: e$ b) s7 ?5 X) j( [
        }
( X8 S( _" G- c        else4 I( J# s& \  j- A
        {7 o" b& @5 M+ L8 U& I0 ]
                printf("No effective message!");( Q: B0 I, W6 u  j5 g5 \
        }: D/ I, m# A" j, ]
}/ e# Z4 n$ \) p: T' ^

, M% m4 X+ s6 y% Z/ A/ e& s7 Z2 _0 Y- o; P: A. |. N) r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 m6 x4 r1 L/ f/ g& O+ j使用下面代码,对内存使用了mmap函数后:
4 k" E/ A/ Z% k% x: d#include <stdio.h>% u# I  Q' w5 z
#include <unistd.h>3 x0 f6 A2 @5 T% k
#include <sys/mman.h>- v6 o7 f+ n0 o; y- o% `- {8 R
#include <sys/types.h>
: R9 n3 B% `5 w) V#include <fcntl.h>7 d" _+ H) c( h' B& L" |

6 u. {- K+ e4 p! x, A: ~$ b#define SHAER_RAM_BASE_ADDR    (0x80000000)' n1 l/ n' H0 _, I5 Y; [. J6 ?
#define SHAER_RAM_SIZE         (0x20000)   - g# _: i4 ?3 W$ ^( g
3 r9 {7 u- e5 S  r
typedef struct
9 l  A: |' }, [7 }# ]) B8 S{
. c2 Y' ~8 M0 ^; Q        unsigned int a;
* s' Q: _3 R- w8 R        unsigned int b;0 ^: h) s! r3 `
        unsigned int packet_cout;
$ V8 d) A5 f! k2 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 N3 }9 r! o7 {! d2 f' C) b
5 x7 K& |! S; @; h
void read_MSG_buffer(int *baseaddr);& _$ g; E2 [/ ]( C% C+ R( @7 T2 i2 I
unsigned int count_copy = 0;
  F. C% u& v$ w. v7 D$ T4 g7 L( N7 o7 w
int main()
! C+ E0 m/ G( I* k& @{
0 A! ^# [8 v, p; }# u6 p4 [0 d) I/ Z        int fd;5 ^( j, V; {' |" h
        int *mem = NULL;9 n. b  t' g. b. h4 i. V7 s2 i# E
5 i+ C5 v" p5 G# a  f* T! `  _
        if((fd = open("/dev/mem", O_RDWR)) <0)/ c$ m$ @. g) i7 ]
        {  z, k$ P* j1 \1 M
                perror("open error");2 n7 s; L6 z# ]& `# X% D& e
                return -1;1 P, U! y6 F: G5 R
        }
6 _" e7 F3 Q, P0 X        - i7 }( P; A( v4 |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, i. ]8 O3 B& |, r- D3 v: d0 p2 a- |
4 Y- H# R6 U+ o9 H& J        while(1); |  v0 E$ a& }* Z4 a7 d) [2 s
        {" u4 `0 S# [% s# j  \+ O
                read_MSG_buffer(mem);; ^0 r* t" j( S! ]6 N+ T2 [# @
        }               
2 J9 M5 C2 @) U. _) r1 g5 c}, b; E( o% ?& Q% p

5 ]/ f. j; O5 B1 ?& ?void read_MSG_buffer(int *baseaddr)( l4 D) `# q1 j3 |* k8 s
{
3 p4 k0 t" g4 I: ?/ H% }        pRX_MSG_PROTOCOL pshreRAM = NULL;
# `* S9 ^1 G# E& b: k3 U* T' X1 m* K* n7 _1 }5 Z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 }* l, D5 _) [0 @& U& O7 Y
  `. _- d9 I+ v* K  h" J
        if(pshreRAM->packet_cout != count_copy)1 b  r7 c& `" _# @' ]6 Y. Z
        {& _' g2 a# _2 {
                printf("a is %d\n", pshreRAM->a);
, y& Y* j) k5 `# Q7 A5 z% `; Q; L                printf("b is %d\n", pshreRAM->b);
2 G. D" g4 Y8 f: g+ y( I+ f                printf("count is %d\n", pshreRAM->packet_cout);' o1 |' r& s( b0 `; J% I5 Q+ C( h3 ?
                count_copy = pshreRAM->packet_cout;
2 g9 D- z* t+ {3 \4 ~& x2 R7 J& B: V        }
# t2 @; p" f" H- o" \( {. h, H        else
9 G! j( h, o! D! Q1 q/ S4 K        {
3 e4 p7 q7 G6 y( @9 w                printf("No effective message!\n");
( ^  ^0 f2 ]. ]  q- P        }6 F" m- S- N* k
}3 `2 S8 _6 M' r+ h( _' q9 u
( X- H9 |( ?: e& k5 c4 G2 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) `1 F& i5 g5 B; m

9 \. N( w: ^/ E5 t; q$ S4 _* Y$ h7 N3 z0 e8 H
7 s# X' i/ S( u( E( k5 h6 u
' s, H, d4 A# D: w





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