嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 B6 v1 `$ w0 t) _* x
* M* q; I0 m5 V: E F K( Z* L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 v9 F5 h A3 g3 ]' ^
#include <unistd.h>
. z! [! l- h: t! s5 z
#include <sys/mman.h>
" D$ B4 v* N: ?5 T
#include <sys/types.h>
% U$ V+ R0 W: N1 o B
#include <fcntl.h>
( y/ n9 S6 \8 a! }, k* a
( a: f" P/ i% u# G t4 r# D
#define SHAER_RAM_BASE_ADDR (0x80000000)
& U2 [2 e: U7 Y5 M S
' A4 U" A, E7 y5 o7 T( _
typedef struct
& \# f6 Q6 G$ f: F) C! c) z3 e
{
( V3 V: M" q' n N
unsigned int a;
% b, Z0 f' J8 @1 N! w" r
unsigned int b;
7 L3 R. n* \4 G% h; e b2 q* i
unsigned int packet_cout;
3 a6 g! S v: S" K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 q! ]9 @4 G8 q% S/ m+ a+ ]2 w2 ?3 Q
4 K$ l) K4 t: \# E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 u$ T9 C) n1 N6 s: V
unsigned int count_copy = 0;
2 D6 d2 Z- `. d& k/ U) D- h
+ E# `& v4 }6 w0 r
0 U/ M+ {% x% `- |: \- r) q& k! d
int main()
$ W m( m% o8 V
{
# p) F* D2 o9 }. W! r
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 W7 i! I+ `3 B
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" Y$ z+ n9 j$ s* l6 h1 T2 P. B8 P
; N. |! b/ A' Z1 J- Y3 ?( _3 b
while(1)
* I, \ y& Y3 ]. N% |. ?3 |6 T
{
( T `& s5 T( h; o1 M
read_MSG_buffer(pshreRAM);
5 o b/ o: ] S" S
}
$ ^2 r; M3 V/ a) f2 f7 u$ s1 d
}
0 m' a, ]3 `0 v% x+ T$ [' s
5 w7 T2 L: W! a% v$ ?; C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
l6 B5 N4 ?, C3 O- M5 F
{
2 x! m- b% F1 `% Y% l9 ^0 X* F3 y
RX_MSG_PROTOCOL buf;
) t* D4 i2 ~( P* |; t8 p, ~' n
. m4 a/ E% j9 M) ~1 m* q* C) D
buf.a = pshreRAM->a;
8 G5 {" \ F: f6 _8 v
buf.b = pshreRAM->b;
* n; y. |$ w, N H( L5 `1 ?
buf.packet_cout = pshreRAM->packet_cout;
- C$ j4 A, t) w9 _1 h9 _* N( w1 j
! w t! D7 a. S3 _. \
if(buf.packet_cout != count_copy)
: R5 Q% B1 G: y3 {* a
{
8 q* b2 f& Q' h0 @* y! K
printf("a is %d\n", buf.a);
+ }8 g1 O% I5 j5 H, ^
printf("b is %d\n", buf.b);
U% {7 |0 c8 ?* B8 t
printf("count is %d\n", buf.packet_cout);
! Q& ?4 n( q T; \# f9 ^
count_copy = buf.packet_cout;
3 H3 W& ?8 S5 G0 Q" c+ c6 m+ W
}
) h$ o8 W0 l. H, m2 r4 t
else
4 R2 v" K) o9 W3 t
{
3 d$ e1 f( u9 _
printf("No effective message!");
+ o( i- }2 p- g- y" `. L
}
1 V8 A. I) S! P# \
}
% }+ t8 v, L8 k V7 t( h
4 e0 Q; t; |! G- E1 w: W
% c2 b# |- S% j+ z& K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) K% Y! y& b. R# k; v# M
使用下面代码,对内存使用了mmap函数后:
) V, p2 x) u! t
#include <stdio.h>
3 k2 g V' U0 G# }) B$ I
#include <unistd.h>
6 B2 m, ~2 X9 b2 A
#include <sys/mman.h>
: B2 D$ E( Q- p" {% L: w* j
#include <sys/types.h>
& i7 L" l' x H3 R+ b$ R8 ~! T6 [
#include <fcntl.h>
; A3 n7 P4 z m" s# i6 u r2 S
9 }" k# E2 O9 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
; ^: ~/ b" e, ]# O9 m7 U% R& K
#define SHAER_RAM_SIZE (0x20000)
, w, W/ H! n- p3 a
$ t3 v$ [! y5 D3 v- U
typedef struct
8 g' \8 U, Y3 e/ ?: s5 N* O
{
Y" A0 Q7 G+ Z- C
unsigned int a;
7 k4 W* [9 J1 m! D+ }1 z
unsigned int b;
. Z8 W- c3 b( f* M1 h* q
unsigned int packet_cout;
4 @& P l I' _' E& M% G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" {& q5 e3 X& M4 S
% Z4 S. v# E# N) z& e
void read_MSG_buffer(int *baseaddr);
6 J6 u# k l! {0 n- L: Y* ^4 A
unsigned int count_copy = 0;
$ S$ o* |& A6 d0 }! k
+ t3 L0 q. j! g' U! j; g) d$ u$ |8 f
int main()
P5 ~' I g( g2 C
{
/ n3 @! G0 B7 _9 H1 A
int fd;
+ } x( z- a. b% S8 [* Y
int *mem = NULL;
1 M% j4 i! Q7 A" Y# T
2 e0 c/ g& I' `$ `- Y
if((fd = open("/dev/mem", O_RDWR)) <0)
7 a% b S' _/ H" T% r+ t
{
% i6 G' l( n( Z( u
perror("open error");
2 {: X! U( V9 J l" g
return -1;
) q# W# |- H( G1 d0 @
}
' i$ J- H8 I4 c9 d! c/ [
% z0 ]8 D) O6 E% ~/ [6 G' c/ m3 k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 a* |4 d2 I Q
. I0 g6 ~9 Z- m# U' \+ @5 m% {, x
while(1)
' @0 f9 F2 e. _
{
) V# @4 @7 g5 O
read_MSG_buffer(mem);
6 Z' y( d5 V( l1 ~$ F3 B( J4 ~
}
9 ?) W5 Q# _4 h( W
}
6 u: h4 `# f& @; [9 x% K V- S
/ L9 F3 w1 B7 e' U& z5 B( _9 h
void read_MSG_buffer(int *baseaddr)
, k0 o0 b- Y, l/ }! B) s" _
{
9 P* Z$ o( ~0 D: R4 f
pRX_MSG_PROTOCOL pshreRAM = NULL;
. ^+ x" N# P9 u% X0 V: a
0 i( N7 `& G. m- v. L! E# ]( B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; n, F+ @; G( Z# c
* @0 k' R0 H) M0 g3 l+ D
if(pshreRAM->packet_cout != count_copy)
) A$ |) s# ^/ }6 x3 U# ~8 @
{
% K* q5 W4 }+ R. V8 L+ c
printf("a is %d\n", pshreRAM->a);
) i1 I4 @% U ~" y0 y# _/ Q
printf("b is %d\n", pshreRAM->b);
2 h5 L! M! A, \% L' |
printf("count is %d\n", pshreRAM->packet_cout);
1 Q& j7 T5 c+ ]! z
count_copy = pshreRAM->packet_cout;
! T. ^& K& w B
}
5 C) Y3 [* C0 z5 b- K
else
% W) Q* G* n& R4 H7 A
{
+ ?; L4 p$ F6 F3 v6 y- }
printf("No effective message!\n");
k. j/ |7 ~* R6 t' @
}
2 U L0 ~3 l4 b
}
; R8 N- L! M- _! T
7 v! f3 ^# ^& I, x. b5 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' w, m* ?8 G9 l, J4 U0 l" g6 A/ E
& t! K( I. q1 u1 B; U
" T9 U8 {5 n/ h; G, C+ {$ W
: T8 [5 l4 v; p+ z
3 i* E' v' f' Q( y+ m% L; {/ U
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4