嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s0 n; a5 p* Q$ c. z: @9 ^6 e- @- n6 P/ k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( u# D5 v! b5 q#include <unistd.h>% T* e- s, h+ h4 j& [5 o0 H, y5 L
#include <sys/mman.h>
$ ~5 o9 P9 B/ W) F% Z; l. O) d/ l! @#include <sys/types.h>
9 W3 ]: N$ j  z- p0 k#include <fcntl.h>3 V" R7 R# n6 B. d2 ?/ H4 ^

% F0 r3 s0 t3 S7 D#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! y4 k* r% k% V. S% i1 F

. n5 C! F# N/ [. U+ J$ ktypedef struct' v. c/ |3 L$ J3 X9 ?8 u
{0 q) O6 I* [% |
        unsigned int a;; k6 a* w' v( j1 I
        unsigned int b;! @1 K6 A% c2 T) b5 l: k) r
        unsigned int packet_cout;
& X1 Q4 O" F. l; E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 ^4 i" v! ^3 T# k+ \8 }$ k! v

9 r& J0 _( @2 O2 u8 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 m- u- \# O* {( T* Zunsigned int count_copy = 0;
2 _. e( K& j8 ~. S; d4 c$ G: H5 w) p/ L1 v, M! |5 b8 a

& H. W% K! G; l  e7 h7 }4 `' g3 Lint main()
) u3 O. Q% n% E{  L  f) C% D+ B( N
        pRX_MSG_PROTOCOL pshreRAM = NULL;; w1 p7 E8 j9 d% B  ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ M- o( r0 n( Y8 P9 V

9 B8 \. J9 @+ N' }+ x& i7 y$ i# X        while(1)
: P2 m9 E$ t. R        {
# \2 t- j- H: W# A+ k" c4 m# S) S. b                read_MSG_buffer(pshreRAM);
; K, c* U, k2 {* m2 ^; z, T        }               
5 E" D/ @, S+ X8 s6 w}
7 z+ a+ @1 ~5 G9 Y
2 ]( J. i3 ]5 D. f' T  [1 G+ N5 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" W! G2 n% y* B, N; L6 ^7 f* e* i{
! n9 n; C$ ?7 M! U9 ~+ c        RX_MSG_PROTOCOL buf;& a/ h# v) P! Y5 a1 U2 B7 h. g
        . p+ P6 D! _' b) G! R5 d, L  Z# a
        buf.a = pshreRAM->a;
" V/ P  g( `: @. e$ j! H        buf.b = pshreRAM->b;
/ P6 I  K" e* n) @3 f        buf.packet_cout = pshreRAM->packet_cout;9 H) I# @* D1 E, n. M4 U
        " D- ~: t/ m& o& p! W8 c8 ?
        if(buf.packet_cout != count_copy)
2 k1 g8 _: p8 D$ ?$ Y+ E        {
' R9 P4 }1 F+ [" n9 K* V                printf("a is %d\n", buf.a);; \6 [& x' \2 b
                printf("b is %d\n", buf.b);
/ {: l# U& C& i/ z                printf("count is %d\n", buf.packet_cout);
, E0 \( W3 \1 ^( ?& G; [                count_copy = buf.packet_cout;
) ^. T9 U) }; k5 L4 L        }- x! g8 l) x, [
        else2 j5 Z" ^$ x3 U  z4 P9 r
        {
8 v! l, S  [: _5 N% H                printf("No effective message!");* @$ g* y0 o* b1 K) O( u3 V7 \
        }
8 z9 Z! H' I- \( p. V" |! A( Z7 I}
/ H( N. k1 G6 ?# O0 |5 N, ^& }8 ]% s. \- K3 W

3 m. Y9 G" f6 B9 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 l0 R: k5 h7 K8 m5 h9 b使用下面代码,对内存使用了mmap函数后:
! J& H3 X! M! [0 M4 {: _. Z#include <stdio.h>" C& w$ O1 N' s% m! I% k
#include <unistd.h>
- H+ d8 P5 L9 P" d7 n) V#include <sys/mman.h>
- w- [; F# W3 p6 F! H#include <sys/types.h>' i: r( e8 Y7 p* R/ H) K
#include <fcntl.h>
" k& f& A) m* c5 F
, t) q& ?8 ?* f. S' U- x  }7 x#define SHAER_RAM_BASE_ADDR    (0x80000000)# |4 \: q. Z1 ^# j6 v1 U# c: [
#define SHAER_RAM_SIZE         (0x20000)   : a9 d9 g0 e( W* K
0 E( B9 |! m5 O! P$ F- z
typedef struct6 ~9 j6 Y+ C1 S
{2 _, `) h2 s+ |  `
        unsigned int a;
. B, R1 @& N% U* _        unsigned int b;8 R: v' l& Y% t( n5 _  }0 c
        unsigned int packet_cout;
8 Z" Z9 X4 m; ?" n: M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! }7 T! O) E9 e5 y7 g  @) S% A9 l+ V; f* F
void read_MSG_buffer(int *baseaddr);: |9 `$ r- V6 n9 u( ?
unsigned int count_copy = 0;4 e( r3 Y+ ^6 C6 j/ G
, x% P8 F2 q8 C
int main()' |; x' x  ^% v$ ?- [& k8 `
{9 j$ ]9 `7 n% \+ z/ a
        int fd;
+ H& |: P) x6 u3 P5 a4 ^: d        int *mem = NULL;
( f- j0 M' E% ?) X
9 E4 O" s+ u9 f" m7 q        if((fd = open("/dev/mem", O_RDWR)) <0)
+ d" r: j4 ^# Q* b7 P        {/ b; [6 F- ~5 l" Q; S% l9 l5 E; ~
                perror("open error");: K/ n$ V, d& m( H
                return -1;4 i$ V2 N4 R6 s9 {& q  q; W% y
        }
( |) b3 s, P$ j+ q" b5 x        
& x: q; [# f! x* {2 I: l" v8 K( ~! }9 m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, e. i# A) z# e
, ?) _1 q. x& [; h- L: Y5 }0 h        while(1)
2 J! x: U4 J2 d7 N# S  u        {, n' \4 q3 @$ [" f9 E( Z
                read_MSG_buffer(mem);
. I! e0 c0 S+ l2 q/ X) p% o9 C: }        }               
; @/ P* v7 U% q! X}) }( h$ Y3 u% \; \6 o
. e2 T* g% Q: l$ L0 @  W
void read_MSG_buffer(int *baseaddr)' ~' P$ e: ]2 c5 ^  B1 o5 B
{
' w9 B; A) `' X4 Y        pRX_MSG_PROTOCOL pshreRAM = NULL;
" y! y8 Y4 B2 J7 ^* S. Y) F  U% x" Q$ I. t. F5 G7 S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 N: P; _1 Y8 A( Y

, _+ `& O8 a" J+ ~2 T7 D: Z0 y2 i        if(pshreRAM->packet_cout != count_copy)
- K- @) [9 `/ h4 o4 f        {
# {$ x: X) E. N                printf("a is %d\n", pshreRAM->a);+ n' y( N1 P! [
                printf("b is %d\n", pshreRAM->b);& d- N; j& |" s; S4 Z  B
                printf("count is %d\n", pshreRAM->packet_cout);
+ {) ]# G% U" u& E0 x1 w, X                count_copy = pshreRAM->packet_cout;
3 H3 Q1 E6 ?) H& `4 z& J7 k        }! g! g# D; o; L/ K% M8 H) l
        else
; n4 J! \1 C+ a* z* T        {$ \3 m0 U9 q6 a" \
                printf("No effective message!\n");& R& @$ `  |: T
        }% J  V7 d: f; {$ L
}
) U4 v$ ]+ ?/ ]* r
1 o, e3 U5 |! U+ [3 a8 p) ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, V& B2 e; B; Q

8 x" p% d! |% R: v' n
* A" @3 {5 @+ i, s! |- M& |3 x8 E' f7 Z: l! j
3 ~1 w% g/ \$ T7 P* U6 b





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