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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 `. |, E9 n* J& m5 I9 E9 O, K% u+ W: F
) m# g3 {$ X- d- o) o1 ]+ Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 h/ f% q6 B, M) ?2 A
#include <unistd.h>5 g, x, I$ m4 w( @2 t  k
#include <sys/mman.h>
9 F! h( T  V4 T( W/ V#include <sys/types.h>
4 ?9 P1 a8 i8 T+ ~$ K$ x# H: A/ N#include <fcntl.h>
" K9 E4 ^, i: D) }7 h+ j7 r! m- J' f, L( V+ a1 @
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , U/ ^7 Y' P0 Z$ q- V$ ~
9 |, g; K9 Z* J/ V2 x$ W
typedef struct1 h; ]8 s# p2 l$ [: a4 @
{
8 O  E/ S7 w1 l% J% ]1 C- P8 z: l9 c        unsigned int a;
2 G% O: \' @' ]" A        unsigned int b;
& u( S0 i. ^" H8 N. r        unsigned int packet_cout;
) D: x, Y9 |6 B, P* ^8 f) z# E9 f5 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 t7 s3 f4 N' A& b. f) N8 B# ^8 C$ b; Q3 t) J2 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 I  S9 x  F( p+ Q6 _
unsigned int count_copy = 0;: d% k) V- {: j
3 y# H7 l# }' k! H; ^
" k: h- K) ^  W$ N
int main()
5 S4 s3 {' b9 C0 t3 o{
0 h, S: w9 y# j: A' b  Y! i        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 j. S4 b$ d, h        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 K4 r& A! \& ^( R7 N- P" W1 N8 U" \; V( v
        while(1)
4 z# p( c# A4 j) @7 H        {* \% u* N3 B5 C
                read_MSG_buffer(pshreRAM);1 w! ]# I! B/ V( g* m" h, a) ?' X
        }                6 g$ Z+ C& }7 `0 A4 V0 b$ E
}
$ R, @9 C, U7 |4 \0 y, o% [: s
  g) t, W) G2 I4 u9 }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 D% ~6 B4 c" z6 k
{
' l7 {( E' |% h        RX_MSG_PROTOCOL buf;
/ U* e0 O- u& F$ h+ z        8 y: ]- W4 G% G* i; f  S
        buf.a = pshreRAM->a;
  W# X$ m, ]( J8 Y6 p$ R        buf.b = pshreRAM->b;
0 F9 `9 e6 l$ d- f/ e  W        buf.packet_cout = pshreRAM->packet_cout;
0 n9 N4 r- R! a! ]4 n. c3 k- ]# \        * C! z* x* K, m: K  }2 l
        if(buf.packet_cout != count_copy)
9 V' a9 J  Z3 }- i        {
, F( p/ Y9 e8 B( O                printf("a is %d\n", buf.a);
2 N# O* f' S5 G$ w2 W* Q& ~6 s! j                printf("b is %d\n", buf.b);8 B( R5 V) [! ]: d4 i8 k! @
                printf("count is %d\n", buf.packet_cout);
. q# N; H1 k* {5 e" G# H* P+ b! J                count_copy = buf.packet_cout;
1 \) ~3 A- ]: R( c/ {6 A* b* q        }
, f1 v% g( g! |6 h/ g4 a# f& @4 C, N6 q        else) i& I4 t- q" `; L6 r! b
        {3 B) ?+ A3 V$ ]4 u% N# b
                printf("No effective message!");# a5 c& A: a1 M
        }
* b8 M4 I# [$ k9 O  F1 J}
! S; X. G7 R# v( e. s5 r9 f3 t
: k! ?; k* c5 I7 C) n- ~+ b" u+ ?
/ F# J/ p: ^9 I8 u/ ^& D2 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; b7 {3 i) O2 |7 W) O: H使用下面代码,对内存使用了mmap函数后:
0 B% L7 G- f$ @4 C#include <stdio.h>5 s' s* q# x. f( m& w) }6 e' J
#include <unistd.h>
9 l# U1 @+ k/ q1 T1 n& B5 U3 }* L; K#include <sys/mman.h>$ W2 R. }. r8 x% z, F' C( X: i. q1 n
#include <sys/types.h>
2 h- D! G8 G( L3 |) J, }#include <fcntl.h>
1 p) j0 Q. q2 _* j% z! u
) @. R& {) n$ Y#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 C  I7 Z% F" n5 H" B8 C#define SHAER_RAM_SIZE         (0x20000)   0 e: p( n8 ?) P1 _2 B1 U

) V" \3 h, v* V. P4 r9 Ftypedef struct
  c4 M* B: J, u8 y{8 `, L8 n$ d% M/ B, D4 B
        unsigned int a;
, P4 b( t+ [; b% r' M# A* Z+ I        unsigned int b;
1 C( }8 y+ k5 G2 J        unsigned int packet_cout;3 t3 M4 }6 v/ J, W/ T, c. k9 o9 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( J. l& F0 j& Z& Y$ F9 W! M' g" P( _( \/ w5 X* u' r
void read_MSG_buffer(int *baseaddr);" \: K0 a. A4 K# ]
unsigned int count_copy = 0;
- k: H( u+ z% ~% K1 Q
4 B- [9 u! r# n3 Eint main(), ^: k7 P$ u. d* R
{/ @/ ^2 q; [  G7 L( y2 e
        int fd;% F7 A  k$ [: f: t* G
        int *mem = NULL;
. T* z6 c: g% g6 ?
: |/ p: r4 z' g) w" ]: [  p6 U        if((fd = open("/dev/mem", O_RDWR)) <0)
4 a& N' i- c: |& {; L        {5 G# V9 j8 V9 w$ `
                perror("open error");
; G) u# K5 Q; h2 \                return -1;
# u0 ?) B- B" G& ]% \" o/ [        }8 E: ?' o1 [9 x: k! m; E" s! ^
        
7 [/ g7 S( i* g4 t) Z" L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( ^  q5 I* ?6 P5 q9 Q) W6 `) M
$ I1 l; _4 s$ X& f& i/ ]  D
        while(1)- V8 x* L. T, N. _" D( a  Z* W
        {
, W# C$ I4 S; p+ Q( |                read_MSG_buffer(mem);0 }; M; Q# L( g8 [3 @+ q- O
        }                * D1 ^; s2 u1 C$ ?; S$ D6 `& }1 a
}
3 f* j9 G9 i$ k1 @2 u; Z4 S& c4 S% e. o; D$ y: n
void read_MSG_buffer(int *baseaddr)4 o1 h& V5 w8 W/ V, Q
{1 Q9 h8 t$ E0 \+ w4 g9 ?7 b
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) ]: ]  ?/ u/ n3 Y- c
8 m6 A7 ?" E, b8 }7 S: r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& }5 a, V) E8 P* ^0 _( I, E- s- Z+ ]9 H3 E! w; `. N
        if(pshreRAM->packet_cout != count_copy)
* Q: c. [3 B; l* Q        {
, ]" X- w7 R- N- H                printf("a is %d\n", pshreRAM->a);8 F  h: s/ e5 Y2 Y6 Y
                printf("b is %d\n", pshreRAM->b);+ h/ {. k; ^  e* l) K' `; r) Y
                printf("count is %d\n", pshreRAM->packet_cout);
- ~) N9 a2 f6 J( E8 Q. R, w* b6 G0 k* o                count_copy = pshreRAM->packet_cout;
/ L% y# q' b5 E. `- K# }9 N        }9 Z9 f; C+ q# K; a/ k. U
        else. C7 d/ [- g# c% y$ G' Z- `4 _5 y
        {
# N# U' t. Y. R3 }! J/ C                printf("No effective message!\n");9 b0 k2 V4 {, Q* J
        }
- q2 e# I# D" d3 f* R}
4 L; x: _3 H# o  |
, O" {( R# P9 m8 t% S) A% F* Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 J! I" m3 b% ?9 S. N# ]
& ^- B! W- x. r
! y0 |8 t% Y& k- X5 @
1 }; k& n, P7 _+ [3 J2 h  _8 A8 I: p! P/ F6 K  d7 E  s# }9 C& r( \, b; |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 01:26 , Processed in 0.039872 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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