嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 c; m' [& u1 q
- v& j: V3 d5 n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 q8 a% D6 | R8 H/ } A6 o
#include <unistd.h>
4 [- X0 M$ A$ o3 z; v3 F
#include <sys/mman.h>
2 @2 a! R: v4 ]. x& f2 ~
#include <sys/types.h>
3 p+ a) ~3 A' }# [5 P
#include <fcntl.h>
* s) U H7 v* { n8 s
" R, W2 P7 v! z5 V* ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 f9 h+ k$ d& s: I
6 @( X1 q9 I E8 [
typedef struct
/ a7 p% W1 o) v$ U% u
{
' o& _) h9 D H. E
unsigned int a;
5 L( U+ p4 |. r3 d
unsigned int b;
1 |, s a% z, L5 S: v9 n# O
unsigned int packet_cout;
. m8 Q" A* J' ~& m, o& a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 z: O, i/ i& i0 A
# U! l7 x5 q& _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 i# d- e+ S1 R1 |; K
unsigned int count_copy = 0;
) D; H0 t5 {% S) w
; M- ~- L! E T% x8 u
$ t) o( w2 m1 Y$ U2 K9 Q
int main()
3 A y' P# C! X: D: e
{
( @1 R. g3 u0 q% [3 D: b
pRX_MSG_PROTOCOL pshreRAM = NULL;
' c0 f+ @: a9 m& I7 b3 @& c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ v( b7 _1 c' E. n; L2 f9 h
- y8 b% r1 A0 d7 o$ D
while(1)
4 H- ^% {6 X' \: P
{
4 Z" S& o* w8 W* \+ k9 f( \" T
read_MSG_buffer(pshreRAM);
# |" F ?7 U0 |$ B+ i" N
}
1 X+ H- p( C) |8 S' ^ J; `
}
) A4 m p- ^: Y1 X
; z E4 a; U! I% N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. ?# M. O) o8 [2 p8 T* a" j
{
. f. k! l9 y4 B
RX_MSG_PROTOCOL buf;
; ~" h3 B* F; [
5 L4 b$ ~# _+ ~) q/ q
buf.a = pshreRAM->a;
% p2 x3 q; i# F$ e# G2 r) r+ w7 m
buf.b = pshreRAM->b;
" t. K" R! J* z
buf.packet_cout = pshreRAM->packet_cout;
: S9 l9 u$ F; [! F$ F/ U
" [! Y$ x4 B0 G, n- ^/ g1 R ?
if(buf.packet_cout != count_copy)
1 w2 ^% \+ V9 d' \) x r
{
! w6 J7 a. ]9 f, X: c8 Y
printf("a is %d\n", buf.a);
, _( y2 `& W; E( ^0 R3 T( d
printf("b is %d\n", buf.b);
4 ?9 J6 E( R5 i- u
printf("count is %d\n", buf.packet_cout);
) Q* Q" h8 X2 U+ e1 `: G) a Z
count_copy = buf.packet_cout;
6 Q/ I; @% A4 O- @* r3 w
}
5 W2 L" R( F) C& {; Z
else
4 D& Y+ L, m. Y4 n/ i2 @( k" `' y2 B
{
3 `: C$ H1 Y; T- |6 N
printf("No effective message!");
- r7 C% r S. i5 l/ j6 S# X) [
}
9 q$ B1 D% f+ k+ j5 i7 c) s
}
9 R" G: n* }' {! O* B7 _3 J2 Y1 J* j
6 _1 J X+ d5 z5 H+ u" \. i- r
: ]! P: I! o8 f1 @: ~+ p4 A/ I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. B! I$ d5 W" B# w
使用下面代码,对内存使用了mmap函数后:
' Z# `7 a1 X5 W2 k! W' }
#include <stdio.h>
' V- z/ l Y/ T
#include <unistd.h>
) [5 H G) b& M7 N
#include <sys/mman.h>
8 g, C/ ?7 _. q0 P9 M4 U2 {: n7 U
#include <sys/types.h>
0 v5 h" W: c$ \8 N8 m) c) \- f
#include <fcntl.h>
& p Q% G6 |$ |7 v6 g! O1 G
! S* }! ^( F+ M4 F
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 r5 b4 `( }6 Q7 A- z
#define SHAER_RAM_SIZE (0x20000)
! ~- c( ] q+ Q" Z0 J3 L: I
) A: D( k8 f! H3 ~8 i# W% `1 w- W
typedef struct
$ u4 L! s/ p5 }0 O- o$ ]
{
9 k `: W& c+ ~. _
unsigned int a;
: _! h. z# A7 g9 M
unsigned int b;
0 o! R: p X( d& D( P
unsigned int packet_cout;
4 L3 K9 l5 @1 i0 A b7 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 c% }& T( n. G! A' K9 x( D
# @1 x2 ^: H: i/ m
void read_MSG_buffer(int *baseaddr);
! H! w8 w8 S. s8 _
unsigned int count_copy = 0;
9 f0 s I* z+ a b
8 N* i) L c& P" Q! S- R
int main()
1 x( ^+ {1 N7 h8 [1 A2 T
{
2 f+ D) t# U" r0 _, j
int fd;
& ]1 ^1 v2 F4 h8 {9 `9 Q9 ^
int *mem = NULL;
6 \' [0 `1 j7 a1 m; e- @# C5 F
# v# f9 D! ?- `
if((fd = open("/dev/mem", O_RDWR)) <0)
* `1 _( Q( m- ?! u; _
{
7 f' F+ ]# m9 I; n& R
perror("open error");
( R# @: @; |* N" n
return -1;
: ~" W5 Y' P$ f
}
% U& D% m' v# |1 k; \8 t
- e7 u0 {7 S1 N% A% E8 `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& x9 j) p. G; K5 R5 _5 J
3 n4 Y4 A/ D& g; W4 k
while(1)
: K, z+ {5 W. q( T; y
{
+ \7 @) j) X" A8 U
read_MSG_buffer(mem);
, {6 E; j$ {2 E8 U0 c: T2 N. d
}
' H! I, E* V1 v
}
3 Q, Y1 f$ b o+ I5 O$ x
( B4 o3 n' x" ^
void read_MSG_buffer(int *baseaddr)
( h' q1 T: w' O$ @( e
{
& P- v+ `& m. i6 l" W* J! P# I
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 {8 y: E$ z$ p j
+ T- {6 @0 q2 v0 S, H9 j$ s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' N1 `$ I- e. G: d {% @
% K: i/ w' X4 \" n# ?! N2 _7 ~5 J
if(pshreRAM->packet_cout != count_copy)
E! L; {" z( |3 @6 T! t8 q
{
4 K F/ ?3 i N P
printf("a is %d\n", pshreRAM->a);
1 E& b& y4 S. x4 J1 G7 A, M
printf("b is %d\n", pshreRAM->b);
: _3 m; |* B% z/ e) ] y
printf("count is %d\n", pshreRAM->packet_cout);
- D; T( G+ s% m$ m5 l0 `; s x4 o v) R# e
count_copy = pshreRAM->packet_cout;
0 C+ v l, {$ e+ n2 h
}
9 Z& @, ]" x6 {7 C
else
- Z; S3 |, D% A& Z5 V) o! r
{
5 ]1 G* K) K, w4 _" g. u4 N
printf("No effective message!\n");
& R7 \3 k: @/ t2 s0 t+ o) v
}
% f5 k% o4 o* m$ |' N) [ `+ ?. h
}
& `( {% ?+ ~' L5 W/ ^
# { l1 z% ?, S, y; f! I2 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 r/ D/ x& u2 A9 ]
3 q5 e, k; `* {
" W$ n, n' v. Y; P2 F
. A+ C: U4 S3 G
- ~2 I, U: i& Z6 I6 n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4