嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* G  J. h: W; [+ Z/ ~4 K& W" G- J5 _- K* y; p! l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 }; D; [0 f. B, H4 i( U6 |
#include <unistd.h>$ ]& \# p2 \' W( S- w
#include <sys/mman.h>7 y* G8 p# P- {  w: K( q7 T
#include <sys/types.h>& Z' C2 y- Z  i4 D# Y/ x  J; o( {
#include <fcntl.h>
! T0 h9 R. m4 @; q; e
! k6 g4 p5 O5 Y0 m- B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 \( q" z5 Q; ~; f) v
; \/ C1 |' Z/ r2 ^: Y9 m# ctypedef struct
4 d$ L. R) a% z, y{7 I" Q& f7 a7 L9 v4 _
        unsigned int a;' c2 y( X# J4 \& x( s
        unsigned int b;
! ?( p; R! J; j2 ]6 K6 L5 I1 M        unsigned int packet_cout;. z, s1 s" ]' e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 J# L7 u5 |# N! B/ X) q# m" t' W; ?! B& W" T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ A5 W) j! ~! ?# T) d4 D8 junsigned int count_copy = 0;8 l+ L& g3 A5 x- x" _

  ?  z& S7 D. @% |) V) {# ?2 R- O# r7 d% E- A4 F8 m8 u
int main(). o5 Y/ h( c6 B$ Y! J6 m9 B! a" }  S
{
4 b4 I6 ~' o' R( |* W3 D5 T/ ?        pRX_MSG_PROTOCOL pshreRAM = NULL;5 I$ K% @4 u- C8 |; ^9 t0 _! r
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 d( f9 c. o) X% `6 L% m: ^4 i. U/ M% v2 U% U# {% k/ p* p5 _8 G
        while(1)+ _  S. B/ \& _
        {
. A* ~: U' V& E4 l# f5 E, w" \                read_MSG_buffer(pshreRAM);
! E% @9 L$ W6 M, m        }                . O2 b! J2 _; i$ K6 H
}( ?* x# p, C/ ]$ ]! \8 a1 R  B1 n! D

6 W' h2 Z$ i# o- D: j' v' Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 N; d( M# `# T5 r8 A1 s
{5 `/ o! A- c! H3 F
        RX_MSG_PROTOCOL buf;
8 ]7 C5 w- @# J        * P; o- \3 j4 V, [; O
        buf.a = pshreRAM->a;- ?% z0 v5 [. ]+ E5 Q7 q  M
        buf.b = pshreRAM->b;* y3 v( c9 N( q* L
        buf.packet_cout = pshreRAM->packet_cout;
5 @# a* w& Z: p8 L        
0 ^% f  d) ^! w+ @, m: X) J; r( F! H        if(buf.packet_cout != count_copy)
" p; M) R2 t0 ~2 `1 R        {
8 f/ H- h. K6 ~7 q                printf("a is %d\n", buf.a);2 @% f5 N0 n3 F, S$ ]
                printf("b is %d\n", buf.b);6 t0 c# G- O3 N$ K9 s
                printf("count is %d\n", buf.packet_cout);1 D  z1 M; e0 Y; p" B% a# A' B( b
                count_copy = buf.packet_cout;6 D, u) w( e- I' B1 n: ~, M( H
        }
2 G2 A7 W' ~( d# v9 ~* j6 n/ x        else
) n, L5 p3 u" R        {
! Y0 Z& s; ?& I& ]                printf("No effective message!");, e- l; ?. [- L# i3 N0 H
        }
- R; E- J' g* l& }}$ O# Q! W# w9 `5 ^7 L
4 C1 S: P" q5 c+ j5 O9 ], C$ T
! z. D1 e0 X& G8 c; }5 d- L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: ^9 G+ u5 g2 `
使用下面代码,对内存使用了mmap函数后:
& m- b7 B1 r4 I3 p! H9 H9 \+ T#include <stdio.h>
2 o; }# j( w  P$ \: Y#include <unistd.h>
/ f7 A( p6 }; i" I0 V! F#include <sys/mman.h>% l* g( Z1 I# p5 j
#include <sys/types.h>% i" t; X5 l0 }8 \+ B' w# B
#include <fcntl.h>
" C. p5 |# q' ]) \0 I' b* e+ v! v9 H' x. F3 e5 [9 {2 p
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! ^) |1 y' i, \; a#define SHAER_RAM_SIZE         (0x20000)   7 @6 R$ D' v7 N

* h4 \9 k: }" o3 L' Ktypedef struct
. P* w  G& A' K6 z, e1 T) T' ?, d{& r& ^8 c' B3 Y
        unsigned int a;
9 |$ C; ^  H7 d        unsigned int b;: g- Q# E. `8 _0 n
        unsigned int packet_cout;% F" o" w- D! q' N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- E+ ]8 ^$ }; i- g% i' j) n3 ?6 t' Y4 h% s; [% F5 y
void read_MSG_buffer(int *baseaddr);2 ~5 G5 `/ O0 L2 l; d& l
unsigned int count_copy = 0;2 l- D7 U& B7 f' v/ N4 Q9 U

; ?3 ]" i: m% M6 ?9 `) Hint main()$ s( t% N9 q' Q1 T0 i) t+ k7 c1 w
{) t1 Y1 ~( ?: i5 L9 E  l- d. o
        int fd;
- H4 O* `, {" i5 ?/ L        int *mem = NULL;
) F+ z: [( c# ]+ i, t* c1 M2 E/ d$ N% ~# X: Z$ Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 T% u* i4 ?" P& Y/ B# P        {
# l  t  ~0 s0 L- D) V                perror("open error");* k0 ~/ c8 A0 k
                return -1;7 g, P& [& R' B; G6 }  v+ b
        }( b- v3 K9 I8 h$ O
        * V8 u. \7 q1 X0 n1 D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 F3 v5 n- K6 g4 `- s3 [
' z1 x0 O' T) m. ^* n' c% R' e
        while(1)
1 V* D& T& n2 @8 W* J0 Z* Q        {# o  p1 C& V! X6 L% Z
                read_MSG_buffer(mem);
/ p. \0 s7 h; e# j, m* g1 }        }                6 q8 q+ i7 }9 Q6 y, Y  c$ w! M8 |
}
1 ?; x! F3 n- [8 N8 C! Y- j  b! k# |$ [& |- ^$ U
void read_MSG_buffer(int *baseaddr)  ~: S! Z# T0 C! n4 C
{
! ^- X" [+ c; f        pRX_MSG_PROTOCOL pshreRAM = NULL;& `" {: o' [$ {9 ~, b& a* Z
3 B. @6 j! Y% W/ i- y1 j) L& o" v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% {3 M9 T/ Z' G2 g- h, T  q' c
& I) e! o" X& `5 i6 R' @        if(pshreRAM->packet_cout != count_copy)" n5 ]# u4 L! D
        {
: Y" {4 _0 v9 q  T5 a                printf("a is %d\n", pshreRAM->a);& t9 T: @( ^9 @) H' {1 q
                printf("b is %d\n", pshreRAM->b);, C4 B% [- ~/ R6 y
                printf("count is %d\n", pshreRAM->packet_cout);
2 x4 @4 `. V6 \% W) A4 B                count_copy = pshreRAM->packet_cout;
, i( C* K8 x" b* m6 u        }
# A8 g% b3 Y! t$ c8 j  z8 s" k- O        else
) J5 m4 }1 M0 S$ s% v4 X6 j* w        {: a3 K: g1 S8 W8 P8 A) ]$ T
                printf("No effective message!\n");
& ^2 p& k0 z  E7 y- X: N        }0 U$ \4 C- M9 P- c2 p) N& d
}
) m6 a, X0 w. S1 m3 h9 ]3 \% V$ r
( V( }/ W; l: U$ n; [+ S0 O$ i没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ R/ {+ \9 P: |$ w, `# ?0 p

6 m; C2 Y4 H& U" |. Z0 {1 t! g
9 w4 D7 w+ Z# v) V5 v6 q. V: @1 q& M

6 J! B% R6 b8 r& ]! s0 D




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