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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% m+ D) P/ P) `8 A. a( }1 i
6 m6 h$ x: c5 l1 W( U4 ~! u+ j3 jOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' l2 V7 c5 p* ~- z7 q#include <unistd.h>5 y. q/ b8 r0 i% Z
#include <sys/mman.h>0 b: m. n1 C5 R& O& p' \% t
#include <sys/types.h>& F9 w+ E* P; Z* c8 B9 a
#include <fcntl.h>
. y/ a! k- J4 U& M$ u* T0 {( o! N
$ w' T* L/ E( }) W#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; P# \! v: N/ U5 X
4 l+ W0 V# C/ l# {! q5 j' [6 |
typedef struct
: _5 C! @4 \1 I" ]# t8 L{
3 h7 o* j, {/ `. B9 r        unsigned int a;
1 B  k; ?6 N1 t1 @3 m        unsigned int b;6 D% b& O( x! q$ O/ g
        unsigned int packet_cout;4 G- P( k4 D  l# }. J% [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ M+ y* l. o" g8 T, K% }
+ _/ Z' z" H" G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ?8 K# J& X  ~/ Y4 W; \& h! U
unsigned int count_copy = 0;, s. U# `0 Y8 k; K- j) |. b# w# V
8 e1 m8 |8 {+ \. v
: Z/ q, E* ~& e) T
int main()- Z) U+ t7 M# z8 }
{( ~/ @/ j% n9 A5 @  E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% ?+ L8 l. s, T& ?  ]2 Q5 }        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 X/ {; G( _5 i$ B. P% |+ h

$ A8 V5 |$ y) `' I* }        while(1), i. {$ u: }6 ]2 n0 Z
        {
( Q  w. d6 K/ N% x6 m                read_MSG_buffer(pshreRAM);
# n. G* L; ~$ t        }                1 O( U5 D$ G  v
}% h* p* y- j0 \  v: \

, k* ~. Q; y/ A  Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 a1 M4 Z: t: i& W" p6 |
{# L* z- c1 c% c' u8 g! \1 A
        RX_MSG_PROTOCOL buf;- ]1 i- h( d1 L: R8 k9 w' o  @
        
. W" m' Q' b% A% G0 t        buf.a = pshreRAM->a;
* I3 t3 x) r) Z8 |4 S5 ?        buf.b = pshreRAM->b;
% \$ ~: ?8 X: C        buf.packet_cout = pshreRAM->packet_cout;
" R9 v5 m9 i' k3 h, q        
/ }! `# E; d! K6 }# m        if(buf.packet_cout != count_copy)* @0 @( j0 [; m+ q, i: |/ |
        {
# f* \3 Y- F6 r& C; \# D% B                printf("a is %d\n", buf.a);# p' B: P  |$ A/ x2 B
                printf("b is %d\n", buf.b);6 Q$ i( \4 t  p4 [! l
                printf("count is %d\n", buf.packet_cout);
% P3 ^6 N2 ^, L! f                count_copy = buf.packet_cout;
3 J. Y. a- ?+ m$ q7 C        }
& w3 w0 g& \+ {. K+ a( @        else
4 f# i! ?  o6 c$ B        {
$ x9 {5 G) X' G7 P# ~& t                printf("No effective message!");+ `2 L. m- j# E
        }
) X% ?0 |4 l0 P( g. g% `% x  g0 ^}
3 j. z9 A& ]  p6 t5 |- N- S2 q5 U1 d% b4 z
/ K: S+ Z8 r% i+ U3 v* [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: P( U- Q) e' a* M) y; I使用下面代码,对内存使用了mmap函数后:
8 R# l$ ~6 r' C9 }. h) F* ]3 J3 r) n#include <stdio.h>
0 f! _4 e$ R4 {8 u1 P9 F#include <unistd.h>( k8 W; N+ J  A+ l# E5 x  e. N+ ^
#include <sys/mman.h>& ]. q( Z# J6 X' t+ p/ x/ h; U. p
#include <sys/types.h>. c  I; g, p" q1 e# h0 R
#include <fcntl.h>- ~) E( X+ X: r$ P7 U3 T: x% q
" C8 y3 A6 H  k5 b) E
#define SHAER_RAM_BASE_ADDR    (0x80000000); @8 u9 k# F: d0 Z7 K' [% s$ r
#define SHAER_RAM_SIZE         (0x20000)   ) y6 R4 D8 b  k9 [

! K- ]4 H# d( Ytypedef struct, n2 ~5 F# i8 @) K# X1 E! t
{
, I/ U3 Y7 Q2 G# Q6 p        unsigned int a;
1 Q3 r1 _' E+ y) R5 T8 o$ @        unsigned int b;
/ s& Q. J3 I0 t) `        unsigned int packet_cout;+ P" q2 s0 J$ G2 F! Y% t/ ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 J2 U( r& U- q1 w4 Q; {: v# S* u- {* O) T4 [
void read_MSG_buffer(int *baseaddr);8 e! I' `8 f) n' P6 p
unsigned int count_copy = 0;
! p& Z) m& U9 A$ `
. f8 L7 ?) e# xint main()
) I$ W0 K: E. l$ s{
$ V3 o$ j6 p- L        int fd;
% Q: o& ^9 }2 v: J8 q$ [        int *mem = NULL;  f& ]6 Q; |/ i. y% O8 C
- s& ]+ I: H. X
        if((fd = open("/dev/mem", O_RDWR)) <0)
5 }; w5 N0 S$ t! X8 a8 p        {0 y" G' B2 l$ O
                perror("open error");
+ ^  h6 s/ v, ?4 W                return -1;
! H& L4 g; v9 D, S/ _8 l) T) U        }3 Q% E% x4 Q. N3 v
        
* |$ ~$ F5 c/ u" J; n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; D6 B* P+ \  b8 ~- i) D* B* M
5 n7 T; S* ?1 _) f" |/ \        while(1)9 m0 f  H/ Y- |" Z" H, s
        {
- V: }$ h) \6 h% c- r9 j+ {                read_MSG_buffer(mem);. p0 D: i3 V* f( A4 g1 a5 h7 \) m
        }               
! e( D3 ~+ T( R" H$ D2 U}( p, K6 }: K9 l% p+ g" h

6 {" t) e" g2 Bvoid read_MSG_buffer(int *baseaddr)" K# z6 P- K* S. u3 D' T
{
" H: d* H! _: R! }; m! Y        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 O+ n9 _+ U( J& p. a0 G* `8 V4 G" D3 W/ i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 W* ?3 Y. V# V" _2 c, U; [/ t, ~9 i9 H; a' [7 w8 a0 i
        if(pshreRAM->packet_cout != count_copy)
9 n' @! C7 c' d) P( f        {
3 i1 O0 w/ Q8 o$ y! i7 t  H                printf("a is %d\n", pshreRAM->a);$ [5 R* p0 P) \4 ~
                printf("b is %d\n", pshreRAM->b);
8 L9 }9 A* ~: ]: i3 U7 E& n; X                printf("count is %d\n", pshreRAM->packet_cout);. k& a5 ~% `# K% t
                count_copy = pshreRAM->packet_cout;
' l! I8 w6 l$ g5 E+ @        }
6 s/ p( k6 x: r5 k9 Q        else
% k  i4 {: ^( Y( s0 o+ F        {
, b5 ]* S0 I- F% K                printf("No effective message!\n");
/ d+ J0 F9 U1 _* `$ T& i        }+ V+ X+ Y! n& d: x2 N1 `  d4 z
}
6 h7 G4 j5 |: l4 @. h8 |
& o+ d$ e  ]0 S) q* ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, x" J: x2 S2 e- ?
. D% b0 a0 u' ^* p7 G) B8 W

/ z% m; D4 ~% b; N9 N) o6 @$ X# N6 L& j' Z# X- r* k

4 Z7 Q5 ]5 l  L4 y, G: X  ]2 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 06:38 , Processed in 0.041510 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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