嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
E' M1 p: B* i# t( z
% r% P7 j7 |, K8 F9 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 t ^: A! X: Q" {6 z$ z
#include <unistd.h>
$ c7 _4 s) b" a* N
#include <sys/mman.h>
$ _9 A6 M1 H: _/ ~
#include <sys/types.h>
U/ [& a6 O4 {! @) L* E- y* b
#include <fcntl.h>
' [" x* S6 v, o3 u1 G9 k
, i! r6 R6 O' b9 O+ z
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 d% l$ ~; N |+ _& V
: d1 g# N1 w6 B; t: C2 x
typedef struct
- u r# ^( C7 x' D3 c' Z! G" M
{
6 v3 V# W1 \0 N! \) y p8 T0 a) x; K
unsigned int a;
C( o, P5 Q- i* Q2 }
unsigned int b;
9 g b3 n( w2 a9 ?1 ^$ v* A+ R! ?
unsigned int packet_cout;
1 z8 b/ g) D5 l1 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( `! x6 [1 v* L( j; @; U( h
% d+ `/ t) X! ]- Q8 W: @- ~' G6 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" O. @. ~, }/ U$ N1 H) Z
unsigned int count_copy = 0;
. n9 M I& W: H: N
- S& j, W0 r6 w# A' s
) \% c4 ^ N: w8 B( {
int main()
# l- q! G0 q5 K. g- P
{
/ U1 R6 c3 W; p4 \1 E
pRX_MSG_PROTOCOL pshreRAM = NULL;
p4 c( C& k! O6 }: H: K4 f8 l, _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" ^8 V1 L' I( ]; h8 z0 d
6 c1 E1 ~: W1 O; B c" J5 a
while(1)
. B ^6 b7 T: V& O
{
' Y* V+ l6 ^- X7 O" Y7 l# z1 }5 G, J
read_MSG_buffer(pshreRAM);
% b% r' W7 L9 r
}
1 e- t( y+ U0 G2 c# u
}
, x( p* \# M' P) m2 v7 ^; Y1 j' ` H
7 _) u. i, P5 q* `- N; C% t7 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 I* L4 c) }: {3 _4 g6 Q
{
% }- P# W5 [ _6 ?- z6 u# R
RX_MSG_PROTOCOL buf;
- ?! _' Q- @" {4 f- \& r" X7 _" s$ U
6 Y" D9 _" H" E n# v" `* Y
buf.a = pshreRAM->a;
/ o8 o/ L2 O/ O1 L+ N
buf.b = pshreRAM->b;
; y$ H5 `+ I$ S$ p2 q
buf.packet_cout = pshreRAM->packet_cout;
$ |9 z6 E+ L" M! }0 |
# Q6 m8 C% a1 h% E
if(buf.packet_cout != count_copy)
& q% U1 L* r; Z- G$ _2 g" n# h: x
{
( {2 J( `8 f& z g9 r' ?( Y2 R) _$ r5 f
printf("a is %d\n", buf.a);
, n! m, |7 t6 J- u5 a+ v
printf("b is %d\n", buf.b);
/ u/ H K0 j) a# q9 U* z. p5 X
printf("count is %d\n", buf.packet_cout);
X0 @0 ? `5 M
count_copy = buf.packet_cout;
$ V+ w$ k2 J. A* V
}
" Y3 ]* ^" w e# x$ R/ D- c- q
else
( \0 U, F3 n+ q" d. i
{
7 i- M1 e+ e& h8 e9 M" J
printf("No effective message!");
* B7 F' w: A6 G% ?
}
a1 _# v1 w; {/ t6 ]
}
" L8 c6 R2 E7 r
* N; e* P5 V' y& u' s, O& y5 c/ E
8 z( Q& A. L0 B8 L* D4 ^, I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Z. J0 ?6 F4 U. t! I k+ i) U
使用下面代码,对内存使用了mmap函数后:
2 u$ C7 x1 U% B" w6 f9 O
#include <stdio.h>
" O/ f! Z( {5 {" h
#include <unistd.h>
8 N6 i# \5 i, g5 j8 X6 ^! h
#include <sys/mman.h>
5 p& s( `! I5 r3 p0 @/ A. d4 `( N
#include <sys/types.h>
$ M- ?1 E* E; l' ~
#include <fcntl.h>
2 I6 \; d& {4 @ R& }, }9 `5 N/ S) W7 `
$ Q3 r. A& P8 e0 |4 Z, ^) @- `. a
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ i; C7 g7 X) z8 v
#define SHAER_RAM_SIZE (0x20000)
2 ~4 d/ P' V Y2 l8 ?) D
3 @9 \# m- H5 r; s& _( e
typedef struct
; r9 d1 b a' c
{
* H+ B& O* ?4 H+ R7 H
unsigned int a;
9 w w( H: N# X9 s$ V
unsigned int b;
+ J- \3 G; p' m& @
unsigned int packet_cout;
& R y8 T6 g' X7 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ \. w r! P$ F4 x
9 k2 q! `. K/ X. M
void read_MSG_buffer(int *baseaddr);
, [' O) }; W+ s$ r/ c4 M2 D
unsigned int count_copy = 0;
+ |6 |: N( P8 x7 Z, {- ]; I U
* X3 O# C" R9 m$ X/ Q
int main()
$ P' K- O; u" x: r! i* B
{
- |# K" G; U a, L4 {
int fd;
9 C& ]7 U: H! o/ V( |! g1 M R
int *mem = NULL;
$ X; z- ^ `1 Q! \
/ {4 H( r& e4 `6 o. D# e7 c
if((fd = open("/dev/mem", O_RDWR)) <0)
+ H. H& ~2 x+ I: u4 [% J5 Q, W
{
# r8 [6 j, f9 \+ D
perror("open error");
. ~5 \2 l: r' u$ ~
return -1;
; I: }( P5 I s) @+ j
}
7 @3 P' t- y+ Q* u
. t. \2 E- n$ c( }% Z- g$ p+ {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 Q6 y% p! t, U- C$ g
% B+ I+ t( Q8 {% ~% y4 o
while(1)
; A% ~4 f7 c* X) g$ b
{
% ^* {! c; m! Q( n
read_MSG_buffer(mem);
% n' R: d+ k4 d2 B" Y/ M0 _) F
}
# {+ @* Y" e: u: ]% u5 I
}
4 a+ L# J; `! b' z. g/ i
5 m1 R7 E, s9 i8 e
void read_MSG_buffer(int *baseaddr)
$ X* P4 t/ X: L9 |+ R2 A& p! \
{
3 h* Z0 W4 K4 x* t
pRX_MSG_PROTOCOL pshreRAM = NULL;
. W8 ], N5 d3 I
g7 d6 F9 a) N7 e9 s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 X7 p0 i: z1 ~5 x& B
; C# u z6 J- c6 o
if(pshreRAM->packet_cout != count_copy)
: v+ d& z8 ]$ p4 D" \8 \3 W+ c
{
5 n) R% Q$ y) I, a3 m9 K% u5 c
printf("a is %d\n", pshreRAM->a);
Q& x9 }+ H' ?: N) j0 o9 `
printf("b is %d\n", pshreRAM->b);
4 q9 e9 A) ~ m
printf("count is %d\n", pshreRAM->packet_cout);
( [( a7 E8 g; g4 f" L/ E3 d% v. o( j3 Z
count_copy = pshreRAM->packet_cout;
( W1 _0 m/ T! D& ]. g
}
" W4 I6 |7 c# ]" F
else
F5 q& T. M; l% L2 P
{
/ ^ w$ A3 N3 {- ~; C& S* C
printf("No effective message!\n");
7 \1 ~# C+ y) x: }
}
4 h, {' Q9 V6 |9 \* y# ^! N
}
2 z4 \7 J: s+ X5 e) U
3 B E) M1 i6 o: t+ Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* W: m0 I( z% L. f/ s3 [) k# b
2 D8 d; x3 b. M
* o' `7 \! N& n% m5 ?* K7 x+ F+ G1 b
_3 P$ z. ~2 D: l" V; `8 \, V# t7 `
; W8 T8 p0 B) P) _9 L, G
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4