嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ z9 s7 R, }+ i" A2 V) U4 K) D$ S2 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 [1 O" t* s/ D% p% [#include <unistd.h>
% j1 ]3 l8 V7 e7 h; O  o' Q# t; c#include <sys/mman.h>
; o3 z, M5 m% e$ G" {& g  X8 }#include <sys/types.h>3 f: N8 ]3 c' P/ g0 s2 g! x+ }8 {
#include <fcntl.h>
, p/ R5 d( {# A4 ]: P. M5 `3 V/ _' n5 S: }* V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 p5 e, m+ o7 `* _, b' \6 p2 `; b% @4 q* |6 c+ H4 U9 U+ R
typedef struct/ c$ n6 x0 I# n' b( H
{7 k# o0 [# z  o2 `9 i% N5 G8 R
        unsigned int a;
7 T) {* n- H0 p  k6 l        unsigned int b;
' H7 M- V  `5 o+ n& C* T        unsigned int packet_cout;8 p( u2 i) l# O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 m1 N2 s3 C" @# P2 X- ]9 X

4 a3 P& H* D  q8 Z0 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- H) ~+ U% a! S* Z
unsigned int count_copy = 0;
1 \8 q% K2 R% N
$ L  z" n. o# ~' |% [" L+ T( n
' ?! d& m* {& ?2 z* W/ b5 xint main()
- t; V; x) g, C8 h5 ^{
9 e9 o# A; c! V/ O4 P# O        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 P, F: d* }6 E) a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 Q) J0 U$ b, i7 r$ y2 e0 ^8 v" V9 A; C
        while(1)
6 b; R7 c: R# \. O% y        {+ q7 `; ~) Y' B* k6 q; e+ @
                read_MSG_buffer(pshreRAM);  l9 |9 q; O* m, U; I+ ?
        }               
, F+ O+ f4 I$ {4 k) }( b; w% X$ G}
8 q9 @0 Y1 [+ \& `7 i4 D
% J& ~5 A* B4 b9 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( {, l! q" s) ]' _9 e  w9 o{6 q4 ?* o9 y9 M0 {: ~4 c
        RX_MSG_PROTOCOL buf;
7 ~& N& |2 [3 Q! J$ k        
; H1 b% `0 y& T, w( f. P: z        buf.a = pshreRAM->a;
7 ~# W4 o) `7 g( i        buf.b = pshreRAM->b;
$ i/ y# P9 G6 t0 Y: L        buf.packet_cout = pshreRAM->packet_cout;
; h3 T% P, J' u7 m5 u& U/ e/ l! M4 y        
5 `# g5 K2 @8 f; A$ u- o- S        if(buf.packet_cout != count_copy)+ ^8 E1 r! l8 t4 Z, ?
        {
  `- }3 S  R, w6 Q: Z                printf("a is %d\n", buf.a);8 F/ b5 N$ F% U- h( g
                printf("b is %d\n", buf.b);& E' h/ y; f% Q4 ^' @  w1 }& A3 C
                printf("count is %d\n", buf.packet_cout);3 O- j# a( i1 c$ ?/ x2 G
                count_copy = buf.packet_cout;& H8 B6 J* \: B4 ]6 O( f
        }
2 x5 @/ u. O3 O$ a        else
  y# L9 r) q# g& k9 G) M1 I        {
2 \  d0 x' y5 A                printf("No effective message!");# {: p/ W' C! y% _9 j4 s
        }  W; s" l# H  D# |  p$ r8 p0 z$ J
}3 c; U8 [3 k' _8 V5 L

/ t4 k6 G2 J6 V3 f6 g+ ?
! v9 n; f) _* x& T0 d6 D" J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& |+ ^5 z% f5 f/ d! m( h5 [) r使用下面代码,对内存使用了mmap函数后:
8 [4 V0 [+ o- L8 \3 R& b* r. q#include <stdio.h>/ \7 e  ?$ x4 u+ y
#include <unistd.h>- F2 {4 M( r% v7 ^2 P0 H2 m& r
#include <sys/mman.h>  b7 s4 L8 d; S2 o# \, g
#include <sys/types.h>
8 y6 C. K1 J/ s#include <fcntl.h>
4 C6 H/ k# U0 K6 ]9 B, ?* t' ~
7 |( z, _  {8 h( v" a8 [5 n#define SHAER_RAM_BASE_ADDR    (0x80000000)9 `% K. }" W2 Y! c& M# W: W! f
#define SHAER_RAM_SIZE         (0x20000)   " h5 k/ d% K4 [2 T( `7 t
: w8 |1 a' |9 d* a% f% f1 c! }5 m
typedef struct: F7 }  h/ |8 N% \* N0 N
{) q. g3 q0 P9 G) T; w% h
        unsigned int a;
+ a' ?2 W$ F2 b8 j" {8 ~) Q- G. x        unsigned int b;$ j' i( M; m' H; N
        unsigned int packet_cout;
* }  F6 f& i  a0 s8 ?2 _$ }3 P/ B; Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) n( _; w1 a# c) k

( l) [4 B% {9 Z6 E+ f9 Bvoid read_MSG_buffer(int *baseaddr);: @* ]* f3 f3 A6 P5 @
unsigned int count_copy = 0;
# S( P7 d7 a$ n" u" ?2 o
! o7 n* B9 K! O4 f7 |int main()
; `9 G; ^- E/ o" f# [3 t5 p- @2 T{# ]; _  A" j) j- |8 `5 d  M
        int fd;/ B! T4 U3 ^0 B9 T
        int *mem = NULL;
3 Y7 h- j3 e2 @. m3 C, q# Q, e" s& T+ l4 }$ @0 X
        if((fd = open("/dev/mem", O_RDWR)) <0)
, G! r" Q+ q' _  g! n        {
& l, d& V/ C$ B7 f) Y, T                perror("open error");# j$ G3 X% a; W% e+ m
                return -1;  Y, n/ F% C" g3 I
        }
1 n- g7 o6 y  E# V8 R. @        
1 N% n2 |+ z2 K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 c6 w0 Z- l! ]+ _
: w. a  l, l& u) R5 }
        while(1)
6 X- j! n4 b4 K, i' P2 b4 k2 E! p        {5 P( m4 F' `1 u9 g2 Q
                read_MSG_buffer(mem);
. ?* e+ v( o) y        }                . E1 {  W6 G4 \; I0 @8 D
}
- J" E3 U5 G$ U/ l" r# [5 E* v' l/ y6 d
void read_MSG_buffer(int *baseaddr)
. \4 g2 [) @* x: U0 H; z& x0 C{; j9 u# u' l, E0 Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: l5 H3 B( k2 T$ |
3 O$ d! B) N% h8 r  ^" Y2 w, o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- X4 _7 P) k- R- P6 ~
" O$ n5 [7 ^$ B$ n/ q3 P        if(pshreRAM->packet_cout != count_copy)
: N& ]- f$ U: p' L+ L) e        {  g2 l; o5 x* A1 [! U' U
                printf("a is %d\n", pshreRAM->a);
1 Z9 ^! R) v& Q4 M9 A# U$ V                printf("b is %d\n", pshreRAM->b);0 L% p2 p( L. a9 ~3 ?/ L
                printf("count is %d\n", pshreRAM->packet_cout);& L+ E& w" R6 ~- P) [# F
                count_copy = pshreRAM->packet_cout;% W$ [+ q; b3 a) N4 a2 D
        }# Z9 C* |) r/ ]" s& _
        else) C  n3 T+ V; [, x
        {
+ ^5 {: `: V' f. V                printf("No effective message!\n");
( r3 I+ t; o3 y/ L  Z6 k        }
( S+ ]1 @0 n$ @* G}
/ i" t# S* r4 D1 \; b5 @% c& U* `# F0 T- ]* s4 A4 I" r- v# z8 r9 |. q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 y1 n: q) U$ T9 s8 ?2 [8 U8 e& G+ e& b, z, ~7 M* U
: ~* K# H' Z) p6 ^

3 [! b- g/ C( K) N! U+ w; B# X





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