嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- I! k- N l3 s
* Z4 l7 U8 o# i @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 {2 O% d& G" Q# p) I8 U4 I
#include <unistd.h>
* }* H: P- |4 p4 G; y3 `
#include <sys/mman.h>
* l) T. t& Y* ^4 a. K
#include <sys/types.h>
( q P0 N1 ` x; f5 k
#include <fcntl.h>
7 V0 z d6 {- w
5 M' w! t2 y9 `7 C H$ c2 U& j
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 u& s+ T. n( F
* B0 ]4 X# ]5 p
typedef struct
" x$ ]% M! z9 A: r/ Y% v
{
' C) d7 o: m: ~. V
unsigned int a;
) o9 d& b# u) H+ J9 i9 B; F
unsigned int b;
" x) m6 B( q) b
unsigned int packet_cout;
" t1 @/ @0 h0 l' y) h2 P7 L" X- ]/ z; }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ ?$ [5 x X2 r; o( s
, b( p1 w9 ]! {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 b9 K0 \, D4 ^# m; i0 a
unsigned int count_copy = 0;
0 W3 F4 W- b1 S( i
8 _- `8 p2 o: i( n/ |
' O% R; O7 O S9 O& {4 D/ Y
int main()
/ w0 j5 R; [1 Y
{
9 ]8 @' B5 a" G$ b }
pRX_MSG_PROTOCOL pshreRAM = NULL;
; O7 Q# U# `' D& l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 R$ v! y9 p2 R W
9 L9 T! I1 L( F. f! P* g1 T( [/ H
while(1)
1 P+ b! G% |$ q! l" A" a7 s3 J9 z
{
/ A' \1 V* O" A
read_MSG_buffer(pshreRAM);
/ Q5 j, O! g; |! O" P, @/ m
}
' j- a9 N7 q( n M
}
2 m* i. A8 `/ F- b4 k% d! _ Y
5 X. Y, Z5 `3 y4 V5 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ x4 A7 ?! Z; t" `* h, l
{
7 u! b9 }" J% o% Z2 N5 H# I
RX_MSG_PROTOCOL buf;
1 y7 d( u" E4 v' b: n. X G8 [0 u$ T
0 l a3 r% \4 ~ G# p5 O, l" N0 ^
buf.a = pshreRAM->a;
& m/ k" ?' [* r* ^) v* P* u
buf.b = pshreRAM->b;
, }7 |* t' v0 M6 I2 o5 H
buf.packet_cout = pshreRAM->packet_cout;
' S/ L1 i9 C; F3 `
: Y) d& A; M: \; j* y
if(buf.packet_cout != count_copy)
: M4 L8 O; k# S2 L$ o
{
' U; ?, _0 C' }
printf("a is %d\n", buf.a);
$ x4 O% _1 y- g! y p
printf("b is %d\n", buf.b);
/ d8 |# P4 y5 |6 o3 h" R3 H; |* B
printf("count is %d\n", buf.packet_cout);
! `+ v# O5 P8 x( I9 g. H5 q8 y5 ^
count_copy = buf.packet_cout;
, o, K4 \: d' ^' ]8 w
}
+ m P6 O b0 |# w
else
, }$ d! M( U) @
{
+ i4 L0 q. p$ [ p9 ?' w7 B
printf("No effective message!");
# S( F/ j8 H+ ?, s" Y
}
5 R/ \) h9 e5 W# F* R9 B9 Q, d
}
7 I1 ~9 o ~# M: V- [+ W
2 B- |7 V& E% U( c9 D
: u9 Y J8 Q0 b9 c J4 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) r# ~: C4 v; J0 |7 k* G) R* M6 g4 |
使用下面代码,对内存使用了mmap函数后:
: s1 c; K8 W3 @4 j4 y. c! O
#include <stdio.h>
; ?5 ]# ~/ [9 F( g8 q2 o
#include <unistd.h>
4 w7 P8 [+ k: D# z+ E" R, {$ n
#include <sys/mman.h>
! K- S1 Z/ }/ ^
#include <sys/types.h>
6 `0 M0 [, l/ ~
#include <fcntl.h>
5 X3 r7 i- o' X" k4 j. \, |
! ~% H' S; |6 e' ?9 I
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 s+ a0 n$ H: g. X& d
#define SHAER_RAM_SIZE (0x20000)
' t2 }: b& I$ `7 Z
9 A- t7 n1 v& e1 Q [6 c
typedef struct
* f5 K" N+ b( b0 }' R. y, u4 O
{
4 {/ Q7 M% {3 L. d7 H7 ?# [/ z
unsigned int a;
+ p" `% W' P1 h9 t
unsigned int b;
2 U/ b7 Q1 Q. o0 _% {# g
unsigned int packet_cout;
. O; A: J, S5 I# s& c' Y' }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 W. X$ j( ~' Z
/ a3 q5 l$ ^5 \; m; H0 ^. r
void read_MSG_buffer(int *baseaddr);
+ V' D4 ~* K% L, l0 s
unsigned int count_copy = 0;
- C O- u e% G+ a
0 v# v/ E( r9 C0 g) I, B
int main()
6 W/ [, @; X. ~7 x( {- ]/ e
{
& O. z* I d5 n6 [& G" P0 }8 D
int fd;
& J- L: L- J; X5 c
int *mem = NULL;
4 c) m+ z% ~2 h
1 h! L% Q8 w0 C) i
if((fd = open("/dev/mem", O_RDWR)) <0)
/ ]) F* c4 U# K* ]9 J4 Z
{
" H9 C. O2 h2 k6 L/ K% w
perror("open error");
) Z/ S& k0 X4 F3 `8 i
return -1;
! r' g9 A, I5 i6 {
}
! z; [( }; t4 F4 x' ~, \: F" `- m
9 I) P V6 p4 v+ a& r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, J0 L- z, H7 K {6 p" S
, J, G# | |3 _
while(1)
+ d0 @' _( W& \7 A9 E( M* a
{
# m }' q, c' V" g2 g8 H# l
read_MSG_buffer(mem);
' y6 _5 Y4 d. S
}
) F! d' Z7 `( k7 k" \* Z; [
}
8 H" }* {% M, V; d$ j6 \4 r# x5 U
6 ~' V- Y' S; s* j, R
void read_MSG_buffer(int *baseaddr)
B3 V; t+ h; a9 z7 x# v
{
, d2 Z, [% T J+ c, y
pRX_MSG_PROTOCOL pshreRAM = NULL;
) t5 S( {# O/ B) t8 [
3 E# [: `% B0 o$ w; h: ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 I3 b# E9 \) u; i2 }& P# p6 G
; G# T! B `4 p2 d; T9 s7 A
if(pshreRAM->packet_cout != count_copy)
- J Q* W, e8 D% ]% s# g% t0 K
{
+ F; @* S' V* R7 E* f
printf("a is %d\n", pshreRAM->a);
' j) e2 ]1 E2 W ~6 Z. T0 u3 Q
printf("b is %d\n", pshreRAM->b);
; T+ e$ b q' `% b3 f: Y; k
printf("count is %d\n", pshreRAM->packet_cout);
; h* m w- ?. W5 n' y. J5 j
count_copy = pshreRAM->packet_cout;
% n+ ]+ a2 |9 Y. X
}
6 ~2 U! A7 S2 e. \- M
else
% N& M+ u- b& d' H
{
: }) H; z3 }) l% _: A
printf("No effective message!\n");
! ~& ]( f m# U
}
- C- V+ K+ Q& b0 t+ z) m8 ]
}
1 v. F; F2 z, v) @: J! p8 J+ t
+ M5 `, i1 F) b% |. l1 j$ V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 u; ?9 ]$ [% G* i5 O7 a# k7 @# A
\$ Z6 `) J: _ Z, |: l* T& [" z
9 c( t3 d+ h2 @' _
( f5 ?$ S7 h) G; `8 E
$ a8 R" s% a( r, ]# P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4