标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页] 作者: zc_fly 时间: 2014-8-19 16:38 标题: OMAPL138的内存映射是否在Linux下已经完成??? 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 r7 ~. O* u& @; X2 {& Y( Q, H
4 Z- m3 ]8 _& C% G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 x9 K+ m2 A) D- A
#include <unistd.h>2 ]( f6 W8 N- @) [' L- F$ i- b5 I
#include <sys/mman.h>. q, z2 Y* ?" K5 S. \
#include <sys/types.h>* N: j$ m/ F, `
#include <fcntl.h> % r* ]" X+ ~. e1 S( j- V " Q8 b! ^) g; A2 N: U#define SHAER_RAM_BASE_ADDR (0x80000000) : W$ P4 y$ G0 U# [4 ?* d; }7 t5 D8 G" W( v$ {
typedef struct " w- M- @- @$ M {5 t9 H{ 7 H5 C. \8 R0 W: C unsigned int a; 4 }% W" Y2 N+ N2 F unsigned int b; + Q7 d/ U2 z0 x unsigned int packet_cout;& s# R1 A' W. Y* D6 V9 `5 J- ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# Z) i8 ?( K; R$ } b
, E' q& m i, F4 l7 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) P! ^/ N( O. g4 C+ a, {5 f
unsigned int count_copy = 0; / A# {: f; X' P+ [9 ?( H: w: y ; z7 ^. j' P2 F3 R ( F: w( a' ^# _) @/ D1 S1 wint main()& a- P7 }9 N$ L2 q
{ 7 L. @; U* s* S9 @$ ] pRX_MSG_PROTOCOL pshreRAM = NULL; 1 Q; Z( A& R" [ [% P pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; [. F9 ?9 L! N5 H & S* u+ v( G5 i! k+ R! @& K while(1)' ~: `' u7 N0 D+ y( _8 B* |
{$ Y+ r) P' [. \, z1 i
read_MSG_buffer(pshreRAM); 3 ^- t( G7 [) {! x- r } 7 R2 H; w: C5 v9 Q F
}3 r; Q& h2 {+ k# w6 l
& j6 R7 Z& w" U zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* A' B0 e/ m I; J$ `2 e
{& g/ ~# J3 q, @. _5 ]
RX_MSG_PROTOCOL buf;7 H1 B) K' y: s. X9 d1 O
W1 K* s3 p% Q7 T8 | buf.a = pshreRAM->a;2 o' g% p# a- L
buf.b = pshreRAM->b; ( q, W6 j3 f- X+ ^/ {% B1 u0 L buf.packet_cout = pshreRAM->packet_cout; 5 `) ^, n% E+ k7 f ! ]7 y4 E/ m3 r$ v( c if(buf.packet_cout != count_copy) - |& T# {) P: ?8 S, S( m, @ {* `! q* D4 t" h w7 X
printf("a is %d\n", buf.a); ' J# L+ }0 X" V' { printf("b is %d\n", buf.b); ( x) B" ]* [- E: R1 v ]+ z* F printf("count is %d\n", buf.packet_cout);! e7 D4 D& w; t9 K9 Q/ r4 R
count_copy = buf.packet_cout; # Y) Y: ^1 z8 D e2 z } - ]" Z/ t8 c) @/ r2 X# v% M8 F else 8 G0 v) u* G% P' } { % g6 k5 i3 v0 ]5 |3 y X printf("No effective message!"); 3 ~% y3 d3 I. Q7 Z }( X$ M E0 O$ F" W4 e$ }; \3 L
} 2 g, b' A4 x$ K- i & e5 d! y5 b* E( H & A, C* A! T, r" P3 ~% f8 A" F( E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 ~- k M# Y. l; ]0 `4 n L, n/ C# p
使用下面代码,对内存使用了mmap函数后: ) C+ v$ k6 U8 g5 g#include <stdio.h> ! K% M3 e# H/ A+ m#include <unistd.h>: `7 o9 [# w; i# z% O' }
#include <sys/mman.h>( c& A, ]* i5 S: {' S, t7 \
#include <sys/types.h> @% c2 r+ }( j/ S- v#include <fcntl.h> / R( b( ~8 z* m5 V4 i; i# A+ n- k3 y7 U
#define SHAER_RAM_BASE_ADDR (0x80000000)1 L: ~% ^3 j8 q/ S) J
#define SHAER_RAM_SIZE (0x20000) - `! p" o0 Y" |/ t T6 l! h5 s8 W/ {3 v
typedef struct " e% {' K ~# C9 r: J{/ T7 ?) Y% J ~" g
unsigned int a; - k% S. z$ M5 [- @ unsigned int b; ! V) y2 L j0 \% z unsigned int packet_cout; + ]% N0 N* X2 i: S0 A/ l1 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; E4 {1 M) n) O! s; }1 `# s
' U7 `0 e% L3 K9 j9 V. b8 }
void read_MSG_buffer(int *baseaddr);* {8 O, o/ }2 j* B3 p: D1 U
unsigned int count_copy = 0;; K: c/ z# ~ j1 g3 C7 a: }
1 E6 i3 U+ i4 ]( q6 R" X( `
int main(). _4 c- x9 k o, b% L! Z
{ 4 I$ r5 }/ Y4 \9 U; X/ r int fd; , Y7 V# R) {. {+ K int *mem = NULL;5 ~* W2 Y M# t$ o, t, b9 N
% f, N$ V5 n; q+ E
if((fd = open("/dev/mem", O_RDWR)) <0) 1 C3 \3 G. q. V" R {# {2 [9 p: O$ Z4 S3 W! K0 V
perror("open error");7 H# A0 L& [: _$ d+ S
return -1; : C D6 D( y: d& p# }1 T3 E }) b7 T! _8 N- {" \% y8 d$ t+ F
5 }5 v# x" ]- Z" _- A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ m# x- k: Z' Y1 I
% y; O0 I% G, y, Q0 J) W; m
while(1) ( i9 M! Q1 ?4 @1 Y {# l1 L$ v. i; I
read_MSG_buffer(mem); 6 ]* K) R2 Z2 R7 [2 Y* a$ D } 8 }% T2 ?, }9 R( W
}$ _" k5 l4 o! m7 D4 d3 O* t
6 X, X& K# @' Svoid read_MSG_buffer(int *baseaddr) * o$ G' A; z4 {! D4 A; B" q5 V: ]{2 ? Z h+ v3 v" R: o
pRX_MSG_PROTOCOL pshreRAM = NULL;' H) ? _1 x; j
3 X5 v0 S! t! d8 m, \8 S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; 3 o1 V. c$ s- V7 k 8 Q: q h9 i) D" [! Z7 |" L if(pshreRAM->packet_cout != count_copy) 7 H1 _" O r8 h2 N0 e; {& } { 4 `; Q# b4 G: ]' H: ^# Y printf("a is %d\n", pshreRAM->a);% y# Y4 F, S* }7 L7 _+ p2 \, _
printf("b is %d\n", pshreRAM->b); + n0 z* B4 K& P+ L printf("count is %d\n", pshreRAM->packet_cout);4 Z2 T9 V* D0 g O
count_copy = pshreRAM->packet_cout; 4 ~+ j* d. A$ C! u3 s& p' I$ {) C }; ?7 r! p; `& F& ]
else# q$ E8 v+ f4 q7 ^: w* e% d
{, Y& N. U: y0 F2 a
printf("No effective message!\n"); z: x4 v; F% X. p4 r% K2 T# u5 T- f
} 5 `4 }+ |$ g- @' O7 V3 k} 5 a4 x( w; l1 [* U4 |+ { + ]2 _; e9 [- o" H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 v! F1 |4 c+ J, ^
4 o, h- c3 j6 P5 B " K( u' u; ], W- P& ?+ [6 t7 w8 {; |! a. M# r