嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 b! q) i8 h' I7 g" O* n
& ^' u! D$ t3 M7 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ J# d! F) G5 s#include <unistd.h>! C! t/ K! g) ?% E
#include <sys/mman.h>& }: E' M. A- u, n- ^; D
#include <sys/types.h>
+ c" Y- p1 x$ j8 w$ k$ R#include <fcntl.h>
1 `# Q! D; D$ G
5 ^4 T* W% u) d  J0 i#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; \( I6 Y0 A4 C+ u# I8 G& Z8 A, P; F, {2 I3 j3 `2 U4 K; |. ?
typedef struct
8 q& f' l# P$ c( v; j# H+ i/ Q{
/ X/ f  W  J/ |7 o  F5 T) M        unsigned int a;
# p% |# O7 M% ^# F9 W1 i. u/ S        unsigned int b;# [- j4 a3 W* @* `1 k+ L& \
        unsigned int packet_cout;6 Y* t1 g0 G5 @& [$ [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. T4 n, ^+ ]1 X5 e7 V" H* ?0 s( s6 L8 l4 R& ^* Z- H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' [: b4 G$ n! r4 z* Aunsigned int count_copy = 0;
( N4 H3 |( s5 S$ a. y" R2 r/ |3 ^2 [, o
  D6 W) s: y! S) \  s0 m2 ^
int main()
2 e6 H6 q  v$ p3 Q{
1 O& \% l# i0 w- m        pRX_MSG_PROTOCOL pshreRAM = NULL;$ e( Q2 S0 U2 ]" \9 _. E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ r, J- f# |; N6 f
' S# S, O1 ~, y, ?$ L7 |2 k        while(1)2 V5 F/ l. ~4 z( H0 L
        {
, z! ^+ o  Z' ?0 p- R  n4 V9 r                read_MSG_buffer(pshreRAM);
/ d0 F' y  {* L$ y# I4 L, Y# b        }               
  H  C; G/ W5 J. ?( G5 I' b}
& S* P6 X3 z, B+ N! m( ]5 C  D1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), D6 _  A7 i1 M1 M7 \2 N
{
9 P% n  S0 m4 Z/ {  h5 Y        RX_MSG_PROTOCOL buf;) K/ ^& H  J/ {
        ) x6 y' Q; U2 R" m, d
        buf.a = pshreRAM->a;* o- R" x# C  y
        buf.b = pshreRAM->b;
2 \: F& I( L) `8 s2 [5 S& O        buf.packet_cout = pshreRAM->packet_cout;' N# o1 x: Q# m1 y7 }3 |% s
        % s5 e! J% u8 K% a
        if(buf.packet_cout != count_copy)& b8 R( g8 B" K
        {, y) H! q* _3 ?
                printf("a is %d\n", buf.a);; F: p/ D# L. I' N7 N0 Y9 D
                printf("b is %d\n", buf.b);9 G& V3 o4 {/ `" V0 f
                printf("count is %d\n", buf.packet_cout);
4 E; p* K* j/ d  z  O! O7 Q" m7 K                count_copy = buf.packet_cout;
' _: s4 {- z3 ^* X$ ]/ J8 \        }
( y( p0 c$ u9 ^/ r        else
+ s7 P4 J: [) @' T        {3 Y# @1 c2 U2 p1 |" U( `) y2 I
                printf("No effective message!");  \$ g; E/ P6 B. r- l1 d
        }
) N) O1 w: Y" ^4 L7 p( c}
2 k, Q+ G4 ?( a' l
; P6 U2 K: a9 r- S
' n' X. i! l% g8 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ Q0 U: e! O6 w( J% q" F2 w2 y: e使用下面代码,对内存使用了mmap函数后:; J4 I3 n6 h4 _5 m% v
#include <stdio.h>
( m8 d) Z) ]* \0 R#include <unistd.h>
3 R2 o# o7 N# p/ Y3 O0 k! T( A5 U#include <sys/mman.h>
* d( j: }! E% S/ V( C+ d% X& Z$ D/ s#include <sys/types.h>+ j/ f/ Z$ Z2 ^1 A
#include <fcntl.h>
8 p7 q, L4 @+ z" _% b6 F' k5 o* @- k# X3 Z0 U, N4 j
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 q1 _) n: _2 @/ m% D  n
#define SHAER_RAM_SIZE         (0x20000)   - |* ~* N! f8 O. g. s9 y. N

% r, z3 h5 D8 B* Q* b7 ftypedef struct5 Z( F: v* h+ d9 H# V
{6 ~# j) T7 t1 C6 X5 G; c
        unsigned int a;0 I+ d" f+ j# k. ^8 b* f; k# F
        unsigned int b;
( w0 s/ |2 m' U( z1 k        unsigned int packet_cout;: V8 g5 i  V! x5 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( S% a! Y* n. M% h7 X# M

. k* R0 g& x1 N8 Zvoid read_MSG_buffer(int *baseaddr);
5 I0 U3 \2 i4 P: s8 F3 l, Vunsigned int count_copy = 0;$ I8 @, t- T- g, x7 d

+ r/ z5 h* p4 x: T7 e/ S4 I9 Lint main()* k' [4 h. p) s1 L. m2 O9 L
{
5 v; \% j9 ^* u; s* T( F        int fd;" ^4 c  w* m+ l" x0 P
        int *mem = NULL;
- j0 |9 s& E5 \( v% `. F1 k9 f- s1 C- T6 ]" _1 H% J2 |
        if((fd = open("/dev/mem", O_RDWR)) <0)$ O0 I8 ]' P, ?7 K8 z1 M
        {( k. K3 ?1 ^, N) Z. `. |4 u
                perror("open error");" J& J$ Q& m, E; B  q
                return -1;
' _0 a; O1 S' i8 c* z/ |! h        }
" w/ X1 q$ n7 I7 w- `5 {. V; l9 R, v        1 p4 R1 ^+ M5 G, ^+ ?1 H' r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# g' B( Q. R7 V$ L/ M3 q
8 x4 y- S7 S% K; ~4 j% }; \- `        while(1)
7 W# d: s0 z/ R! H* m" A        {, i. g6 H% I1 p& q- \: @  o9 g+ e
                read_MSG_buffer(mem);
9 e8 E9 x; f, l        }               
: F0 }2 u" G  S) l, N}# a% K. `6 L* q- u
8 I& r6 u- r* f
void read_MSG_buffer(int *baseaddr)
) n( V, t' w+ S- u" b2 D8 i  X{
$ X- C2 r( |/ |) z        pRX_MSG_PROTOCOL pshreRAM = NULL;
; o& T5 I- v4 f
+ B# _/ H, t/ p- q) h3 w5 P9 s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- c: C, ^7 r9 I0 J6 B4 F" A3 k, W, j# ^2 v! ?1 G
        if(pshreRAM->packet_cout != count_copy)
& R* T" y+ N/ K7 @        {
4 K8 u5 C& I5 v4 j2 `6 Z                printf("a is %d\n", pshreRAM->a);
! g7 O9 m' T5 E+ a9 d                printf("b is %d\n", pshreRAM->b);
. ]; B& W, g* U& Q1 P0 Y$ }                printf("count is %d\n", pshreRAM->packet_cout);9 e0 w* V: a$ Q* T
                count_copy = pshreRAM->packet_cout;  n, x6 @: ]& u" a* n! X: D# X
        }
0 u8 h9 S1 b  M        else
, q3 D6 m8 m$ B! C+ ~; c4 E        {
  _5 m- p& Z" p3 ^0 W  ?                printf("No effective message!\n");5 G. \  g- `, |$ G& t3 r
        }
2 B# \3 b7 h7 A( ~}' d8 p& d0 G* }

+ [& P& x8 g( D0 X1 G1 R没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 V( L% Z+ M" |
. w% ?. R# f1 @' x' }4 W' ^0 h4 [' U+ O- m' ~

( J1 t3 ], [( S0 _9 K+ o8 g
( t$ D# N, F/ K" j4 E




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