嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 z6 G0 N/ V5 y8 |
) K6 G" R# Q5 a. [) k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 `# U" ~. ^  u6 X1 V#include <unistd.h>3 z) e3 D, U/ k1 n6 m
#include <sys/mman.h>
, Z5 E+ D- T" u* O6 F4 w#include <sys/types.h>( ~, [  S0 w& G- H9 F# m9 I: h4 E9 @
#include <fcntl.h>
6 D% o$ m' @1 j# h6 t; E
( j4 D! b( H9 @#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ X9 r' r6 ]5 E
! H/ U( F( p' Z# A- q3 o$ i9 i1 X5 X
typedef struct
# }4 D+ \8 H9 c/ ]{+ K& ?/ }7 E* m1 D1 a4 m% P
        unsigned int a;
% j7 Z( D# e: m# `( j        unsigned int b;9 i1 D5 q# P% s$ y; b1 ^
        unsigned int packet_cout;3 s+ [: Y' Q& Y9 r; X4 Y! C! a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. c! l6 F' j' o1 \- G8 p, {
: F2 S/ ?" S3 b& jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 A0 C$ W' [! `" v( m! \unsigned int count_copy = 0;0 L% O6 y9 ?, D+ D/ }

% x) \9 O: L$ v+ r+ @
# ]2 m6 R- u2 g- bint main(); _" _. O! w- F6 c. C. J
{  f8 b1 K) Q  b, @
        pRX_MSG_PROTOCOL pshreRAM = NULL;* T( w* E! L7 n+ N& O4 m
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 S4 D! U* u$ c
) V8 p/ ]% {/ E2 d& g8 r6 f+ P
        while(1)
" h; a* f$ C% e% k' H/ ~        {
# {9 O) A4 a7 ^3 P! `                read_MSG_buffer(pshreRAM);& K# \* @) u8 n
        }               
0 C/ x" o9 x1 L; n6 {}2 @# r- c# R6 D1 S
8 @1 P; z; v! f8 T% v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  g2 w$ ]: {/ r0 ^
{
# ^# Y% v% I. a; r: ~        RX_MSG_PROTOCOL buf;
' Y' {) i1 A6 n' X        , M3 N2 x/ k2 {& r) P
        buf.a = pshreRAM->a;( T/ z9 [( \- g  T* z  [5 @) q6 e4 K/ W* E
        buf.b = pshreRAM->b;
) e- F( l/ q/ q" ], _3 {& y2 }# H        buf.packet_cout = pshreRAM->packet_cout;
" B3 U+ B0 n$ m0 I        
2 V) M3 g6 p0 C, A7 Q( q. y* E        if(buf.packet_cout != count_copy)/ p( D* P# `1 V9 V& u, a1 r% g
        {% i% R! f0 {! H$ x1 Q
                printf("a is %d\n", buf.a);
6 l- b; E5 p; S$ H- F; T  ?                printf("b is %d\n", buf.b);
" ^7 u* K1 T0 o% @6 z                printf("count is %d\n", buf.packet_cout);) z! V! Z$ I1 d
                count_copy = buf.packet_cout;5 U$ X% ?- d6 u8 A  O  Y
        }
6 A: O3 e0 r2 R5 Y0 V( g        else& {( T% [4 N) `( _
        {
9 x1 H8 F0 e( X( S; r  `                printf("No effective message!");
3 t# J' y/ |, M+ s  e' A        }
, b6 N5 O+ p. G, G) f4 i# Q5 c) |}
- ?4 }3 t* j. q) u+ \5 @
. ]% o  a0 A3 z; P/ m' ^/ ?) S
( K1 y. g  {+ \0 c  o3 e+ b  Q9 M8 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% {% P# [" T; V0 e& z5 R
使用下面代码,对内存使用了mmap函数后:
) x, N- A9 d4 C/ P/ g#include <stdio.h>$ j4 r* a8 x) `$ a% `( G* U1 W
#include <unistd.h>: R9 E* H; I0 v9 p! Y$ _, d- ^
#include <sys/mman.h># v; W1 a" x! W/ \8 g! m  [2 C+ E9 b
#include <sys/types.h># ~9 Z# u! A' M3 y, w
#include <fcntl.h>
" {9 I* V7 N# ?: ~* w, P- v6 i5 |; Q% x1 [& Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! |$ z8 J5 d$ k3 _# O. L# L#define SHAER_RAM_SIZE         (0x20000)   0 Q& K, r2 ]# a4 x  I" t$ E

/ p! u: C% c4 j; Otypedef struct& Y4 R0 T, r$ f1 Z9 Q( o. u! \
{
: G# S* g/ J5 P2 [        unsigned int a;/ d' P* k5 A0 x: q6 C
        unsigned int b;; @7 @" A; W; ~
        unsigned int packet_cout;- A0 w( F# d1 B8 @- ]7 V. L5 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( p  i$ R! {5 [* g3 O" ?# J
, i9 G' f1 r: C0 g" R7 X* ^
void read_MSG_buffer(int *baseaddr);
" {$ W4 A) c/ [4 nunsigned int count_copy = 0;  N  \. s1 W  y  C- Q1 w7 X/ e6 a2 t/ A# f

# p: r5 _: u( v+ w- f' Cint main()
7 ~& f( D3 U6 S3 Q1 m4 t0 V{
$ X% w* x4 L/ G3 j" n5 |# w        int fd;$ R. W* h$ _/ ~) e  K
        int *mem = NULL;
9 \1 O9 _* N2 P+ K2 v: [
9 o8 O. O! y6 I3 m        if((fd = open("/dev/mem", O_RDWR)) <0)) G2 X7 R; y0 u2 I
        {
* }. S" x# O' x5 ~1 x& @. o1 d                perror("open error");! {# S0 Z! U) [0 A) Q
                return -1;( M0 T. e( X; s* F; e; b
        }6 \, s& s3 D* _2 h. w" N" |# ?' k: H
        5 i9 C6 n% A8 K$ m7 W& x( ^0 h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, f# r# H; F5 t2 t" D! \& P
" I4 w, {" s" C- _
        while(1)
3 Q8 b1 B6 A6 _. [. J. B, \        {' V/ O, M/ o  ]2 Y
                read_MSG_buffer(mem);
# [' t( q/ }+ n( [& N        }               
( |( b  P8 L4 }! [/ Z# k7 Z3 b}
: G( A% n( ]* ~8 r/ B
6 R/ ~  i3 l8 x& mvoid read_MSG_buffer(int *baseaddr)
7 }2 V# b$ F, m" Q{
. A! o8 j- L. k1 g        pRX_MSG_PROTOCOL pshreRAM = NULL;$ \; y$ D( m7 z: }: G7 [) ]

' G/ |# Q$ Y+ H+ o- d0 l$ r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( U/ F6 l1 K- z$ U$ R: ]
7 Q/ d. k. O% c+ C' i  U) r
        if(pshreRAM->packet_cout != count_copy)* p; N7 R- t6 a
        {
- h  ^& l# U: d, ]' b" k                printf("a is %d\n", pshreRAM->a);) Z' v, H- O7 {) ~' {
                printf("b is %d\n", pshreRAM->b);
0 |  Y7 |9 A9 p" }- c! ]& p4 X                printf("count is %d\n", pshreRAM->packet_cout);
. _9 j: o8 `: A& Q6 Y5 |                count_copy = pshreRAM->packet_cout;
: h+ u; m" x' F+ `$ w        }# N/ E# H) `4 _( ]) n- `( g4 B. K8 V
        else
0 Q5 `4 W) \' G, C0 x4 X        {
% \5 T. p% a# x" I6 m                printf("No effective message!\n");: W* R& L7 d) B# ^& b2 h' d
        }
: y& ~4 K( Q. w% @8 d}
) E1 k% x2 ~1 g) M
/ Z* d# X( k$ L5 j9 h* u3 D' l+ a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; x8 \9 K% e5 @, k! |
- c; w+ [- S0 l- ?( v. w

; D% g* N: F; c$ ~7 n2 _0 O
4 p; Y8 F2 [  j. |% H% p1 O) ]0 a- I! V: v- O0 N/ y6 x, P) e- u





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