OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5755|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " F# P2 P6 q1 Y5 B# X+ [

4 V, i- N2 @* k0 x4 k7 UOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& H6 M& C; t2 J8 j. S/ V4 X
#include <unistd.h>
" O8 _: ~/ l  A! e/ g! I#include <sys/mman.h>) @; o" Y+ F+ U0 W# n
#include <sys/types.h>  a; U+ m4 X2 m$ u1 m0 T
#include <fcntl.h>
5 p$ [; X" J7 n2 {- s( `5 ?; q7 K  k3 |. d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 t" H8 l9 T7 I# M) Q6 h

+ t: N/ Z0 W" L6 G9 {: c: F7 stypedef struct
: _3 _+ G& K& o& v  r8 V6 P{7 T; l8 w% A' x+ n1 |
        unsigned int a;
; S2 J& [# ~& a0 D+ L        unsigned int b;; ?( p7 H1 h' s' K
        unsigned int packet_cout;: i" {2 q+ q. ^" P# X5 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 u# V5 ~$ J) d& H# A0 s) E5 w9 K  \& j; T  j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' K( a( O0 v1 R2 N6 H9 vunsigned int count_copy = 0;* T- [4 v/ C: I2 r8 M- c
7 E4 S6 i! N# r, R# A
( T" i7 w9 g& _
int main()2 }' E. h. m5 m% v2 x
{
0 X; u5 b; [7 y7 l9 U* `7 i. {        pRX_MSG_PROTOCOL pshreRAM = NULL;+ ^# Z4 Y2 k  _4 M4 W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, \: b( q0 \* x( w, A  A! V  J. _3 ?4 f' ?4 ?% h* p
        while(1)
1 x* @! o0 ~, Q        {
8 q! B) r0 @* F( g. A6 g4 o                read_MSG_buffer(pshreRAM);
4 U, P( h% |9 {3 K0 _! @- S0 f$ T        }                ( W- j+ M0 y/ s
}
' {: T; @( I5 a5 [9 D
- ?! z1 Z9 g, w6 t2 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 E" I- Y1 h+ t; \) A. [{1 Z4 c- i! j2 S4 \  @: e+ N- F
        RX_MSG_PROTOCOL buf;- n6 i6 [: R: j0 t* \$ Y9 x
        
6 p* d/ E7 K3 |) C7 I        buf.a = pshreRAM->a;
1 l8 Q+ p0 F, h0 I: Q: t        buf.b = pshreRAM->b;0 b: C0 H8 o& ~- Y
        buf.packet_cout = pshreRAM->packet_cout;; }$ L% {/ o$ U+ K1 K6 i" k
        
2 P) X% p2 i4 [0 M' d        if(buf.packet_cout != count_copy)" k! G" w6 c- ^/ P! |  c; K
        {8 c5 e- n! f' E2 w7 N: v
                printf("a is %d\n", buf.a);- J9 c( j/ ]0 E" x# U! c& g& u8 Z9 @
                printf("b is %d\n", buf.b);4 d& x4 w6 |; \* @9 u
                printf("count is %d\n", buf.packet_cout);0 B6 b0 |. ~% V
                count_copy = buf.packet_cout;
; W9 O6 F" S7 Y1 ^2 t) W5 h        }
3 r* w* c; f2 C2 [" D# ]9 i* Y/ [9 `        else
  B; b4 L' \" z; b% J  W' q, X% i        {3 g1 n) z0 Z# A9 [
                printf("No effective message!");$ m/ n( M2 g# ~3 h
        }% F! L2 `# l' r% @
}
% a8 a2 a& [- }) X8 @% K+ H4 h. f6 y0 _- z3 _* a' H

/ H1 g1 H; q4 x' e8 I1 d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  T/ \1 G0 N! O' ~$ f( i' l
使用下面代码,对内存使用了mmap函数后:7 B0 m9 O2 v% ?
#include <stdio.h>0 l* ?9 F2 ?1 j* ^9 u' r
#include <unistd.h>0 j# W4 {, X# p- M- I) u
#include <sys/mman.h>
0 `+ S0 B! d/ k; O( s#include <sys/types.h>
& `6 w. x# s2 e2 o#include <fcntl.h>
/ Y+ z0 C/ n7 m: n( K
; L# e. A: t, H6 s8 N7 ~9 e#define SHAER_RAM_BASE_ADDR    (0x80000000)! q( E/ C7 x, b" ~% A( ^
#define SHAER_RAM_SIZE         (0x20000)   ; q' w9 D& z9 a4 \
, A. v( {6 ~* ^- R
typedef struct6 R5 F! q# g' L" b+ I- Q
{" {5 Q+ G  x, n+ i& G- A
        unsigned int a;
3 ]6 p  |3 Y$ F1 k6 [, D8 z        unsigned int b;
# J; a0 t8 w. }7 ^' D( f        unsigned int packet_cout;3 M; H* H& |3 |  v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: t3 F' }, m* Z
. k$ ?/ [- p9 l) ^" B3 Hvoid read_MSG_buffer(int *baseaddr);
7 A! w9 {2 A3 e& T4 i9 r0 Sunsigned int count_copy = 0;* Q; J$ x( T; u8 c6 j0 H

3 O+ Q( X1 B5 F7 hint main(), e" R2 K) {/ }7 ]
{+ I. t1 w, g+ |( |
        int fd;7 ]  N% f1 r, G+ H1 i! z" {1 o
        int *mem = NULL;
: N3 J' p  a. K8 @( W
: ?  |4 h+ k4 y2 f& p8 m+ d        if((fd = open("/dev/mem", O_RDWR)) <0)$ w" w$ K. B# ?
        {
) P& f  j9 U& [4 w4 ^& p0 Z( g                perror("open error");
7 q+ j; ~. C, Q: w                return -1;. T+ @2 w+ e6 C' m: Z
        }5 Y' R: a8 A/ e" N
        ; k$ |& h: B1 h) i6 \( `, M9 x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, `7 z( R: R: T. b4 l' e/ o  D) Z" N, d$ Z# z& l1 ?. g
        while(1)9 s* g! ?6 A8 |. r3 L: n" u
        {7 W% J8 e/ K0 u1 x: a6 C5 Q* A
                read_MSG_buffer(mem);2 O6 A0 n4 a& d
        }               
. V( j6 l8 _) i7 l7 {6 B2 F}) s- m- A/ `) O2 R9 m$ P' u. H
9 G- v7 i' T0 C# ^
void read_MSG_buffer(int *baseaddr)
' E& Q* ^: I4 U- G: Z, r- g& i{
, |7 `: Y4 e, }% F6 C        pRX_MSG_PROTOCOL pshreRAM = NULL;$ Q9 d/ P3 b# Y% v. j- u

0 T1 W8 |0 c" A7 N. D0 _$ e0 r# B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" }* C9 x' ^$ y5 K2 a: V
6 [' p6 p1 j4 T9 }4 I
        if(pshreRAM->packet_cout != count_copy)
; k1 d8 J/ T: R; v% J5 O  r        {$ r  G8 J" L* Y* R2 t
                printf("a is %d\n", pshreRAM->a);% T; W; @4 b* m- E4 B* E7 Z2 j$ F
                printf("b is %d\n", pshreRAM->b);% B$ b6 j) i4 O+ D& O
                printf("count is %d\n", pshreRAM->packet_cout);
4 y2 ~# K! Z3 Y- @/ e! k! S                count_copy = pshreRAM->packet_cout;) H6 v$ w8 l5 v- D: P2 b' u4 x6 e
        }
: X! p4 @2 b& K1 c% w# I' d        else
' g1 c, K) m. Q; {        {
/ a+ V/ w6 C# |5 }$ J6 D                printf("No effective message!\n");
! t9 h1 E, B0 e% B9 X! ?( a        }
" }' r8 i% P1 X9 G$ W}
3 d" g  `( S& e8 V+ G  i* f! e8 a& g+ [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, v" N& @3 G" U% u0 m2 c& d
2 w9 `: O; p  T) C
; j$ p8 ]# u  b- p/ m9 O6 p& b
- ]: ~: u5 o* t! ?
- o9 J- J1 R' [, h) L/ [3 F: E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-19 21:47 , Processed in 0.044429 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表