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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 Y" N5 @: j# l

. ~- L5 \! Q, ]! XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ S; F4 L  E( L5 g1 E
#include <unistd.h>
5 R  N' k+ {$ ^#include <sys/mman.h>* \1 `" y1 @, K; @8 v5 @
#include <sys/types.h>7 B& x" G1 \8 p# g; f7 F
#include <fcntl.h>
' W# q# M% ~( V0 R- T6 v0 Q, l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ S' D. Y1 ]* Y# t1 b+ E+ K! O% V6 U. e7 `
typedef struct4 o2 I: H+ i5 W) |  r6 |4 e
{) O! X* H( U# k1 v
        unsigned int a;
( q* e  g& F6 o* s' O        unsigned int b;1 _: @6 U- c) S, Z$ R  s2 a
        unsigned int packet_cout;
: o5 t2 L0 X' A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ ]& W0 C$ N# W: I/ a7 f1 F; b

1 k7 \1 i3 k+ D- c  z, Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) p8 k8 n0 y7 d. j* E! }# r* l3 gunsigned int count_copy = 0;
+ Z; B3 Q/ b7 R2 v  q; N; G: l$ I% Q' g8 _

: ^1 }. x2 s0 V: Pint main()0 @- X1 q. F, F# ~+ T5 R9 O/ d
{
$ i! m: u1 o8 F. Y+ X4 w0 c        pRX_MSG_PROTOCOL pshreRAM = NULL;5 v: d2 Z: d, @. G+ G, ^2 i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  C+ k% S5 A0 w$ Z3 ]
* \; d8 l9 O9 s6 I/ O* ]& U        while(1)
2 j7 \7 q& N* j7 v4 M0 ?        {
& c' y7 X) m" f6 }' {- L! f3 {8 R+ D$ d                read_MSG_buffer(pshreRAM);
4 |9 {5 r: n( @6 O/ U! S        }               
8 X! [3 h5 R: `}
8 J+ E- M" X9 R! q
5 M" h5 A5 W4 w4 U" ]! qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' P. Y3 P: `6 c7 b. P; _{
* Q6 R7 h! N/ W! \        RX_MSG_PROTOCOL buf;
6 o; j" Z! q1 }" G- H1 k2 y4 K! F        
) T7 S" X; n6 F9 i        buf.a = pshreRAM->a;
( [9 \- b2 l. ~' l0 O# q! [$ G        buf.b = pshreRAM->b;
4 y* X# t4 U: @  W        buf.packet_cout = pshreRAM->packet_cout;) B' W& r1 [/ {# H( l
        
. l. W' @. f$ m        if(buf.packet_cout != count_copy)0 n# q/ s; p# S  j
        {
, F" r& J# n5 ^4 C! a, I                printf("a is %d\n", buf.a);
9 }* T) b; R' ^# o5 D+ \                printf("b is %d\n", buf.b);. z# i* {: m- e: }" t1 R
                printf("count is %d\n", buf.packet_cout);
( y  Y- P- h  [5 e) S5 D  k  G9 l                count_copy = buf.packet_cout;: r# l4 v5 j& v. L: X2 ^
        }  i# F8 O9 B! C3 p
        else; x. C8 A) e6 _: B' D) q
        {" X) e: x& r* w% Y  t3 a% `* H
                printf("No effective message!");
- X' a7 O: W4 T. n# k6 Y        }! b3 W0 `$ \+ W2 F! t
}) e0 s( d6 Y' t9 a
! h7 t! c3 ~" y+ s7 q
8 [+ H4 @4 u9 a* I6 t/ S2 \6 ^( N* e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 \2 C. Y+ X" X0 G& j( a8 ]: ^. g
使用下面代码,对内存使用了mmap函数后:
8 n/ I& ?2 q" B* ^* W9 G' T5 ?9 a1 k#include <stdio.h>
+ E7 U3 S1 @' j# a! j6 S#include <unistd.h>7 o* D" m6 n" A. w
#include <sys/mman.h>
* y7 X( x7 `( H0 C& c#include <sys/types.h>( D/ G6 g$ l1 g& z/ V+ l) {( P1 z
#include <fcntl.h>
+ K9 S" c2 }) k; M1 v; R: F- M- y- _. M
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 u% g" f+ D  x% g+ r
#define SHAER_RAM_SIZE         (0x20000)   
# L" [% x% y4 Z9 u1 K3 \2 Z
" r9 y8 c# V3 @" U1 `3 B7 Q3 y7 Y: _: \typedef struct3 x; B8 ~' g. c
{
' `4 `6 X3 K; s0 X( H1 ]% Y9 U" a        unsigned int a;
3 n* H- o( Y- J2 I        unsigned int b;$ [4 _5 Z! A- Z* ]
        unsigned int packet_cout;6 ~; e+ {/ |4 Q. a/ ~% B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: y) j7 J0 c/ L5 r' {2 [
: s/ m) m8 \; \( Qvoid read_MSG_buffer(int *baseaddr);+ Y* V" B( C' Y* M1 N
unsigned int count_copy = 0;
) o7 U! s% y- n5 B1 i6 C
9 T9 O; W8 o/ h: x. {; Q) x4 rint main()
( l2 j5 Y" k7 D) L* [1 z7 E{, X4 p+ _: K% W+ G1 Z
        int fd;
' c$ t! z; P8 m8 F        int *mem = NULL;; T2 i( X" S( ?1 i1 ?

  U5 @: B) v% x        if((fd = open("/dev/mem", O_RDWR)) <0). P* n% l- \: r1 E) G
        {5 H0 D5 r- {# a' g# [" H, e
                perror("open error");
+ b& a2 T, w# N                return -1;$ S# e# K# C+ z3 s5 X
        }
, e. E- P6 d2 [% ^5 R1 D        5 A  o0 x8 m: c! a. H' b3 y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. D' V8 L) l4 d3 i2 W  h# O
+ v8 K- U* E9 n& _7 L5 f% L, ]        while(1)
- k- m0 {6 f/ r) W* L1 k        {% l& P3 `0 A! \/ T
                read_MSG_buffer(mem);, L5 v: k$ Y0 d( n: d1 L7 x6 e/ O4 ?
        }                5 v7 C; D/ g# K1 R7 {8 c2 Z; T8 F/ U* t- `
}
: \% a, ?, `4 R% w& D" F" f2 J( m  \6 s, k. l; G7 I' }! T7 [
void read_MSG_buffer(int *baseaddr), y+ f9 ~( s$ |8 D, {0 B
{! p% p! j' @" o7 u8 O  h
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 F' A* ]/ {1 q8 J9 f: O; z' V

7 ~% S5 G2 A. T6 w1 x+ f. ~. W( F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# z& X$ I* ]* g0 c/ [+ L* g0 c

3 V- {6 |7 ~3 _1 B0 n- E% a        if(pshreRAM->packet_cout != count_copy)9 [9 c3 P4 P( [
        {7 X# ~& O  Q+ I- Y' P* O
                printf("a is %d\n", pshreRAM->a);
; N5 j" y: n9 _" u- Y/ S                printf("b is %d\n", pshreRAM->b);
% C( y! N7 j) g& ]* Y! y$ D                printf("count is %d\n", pshreRAM->packet_cout);9 m2 m: N; L5 b  Y
                count_copy = pshreRAM->packet_cout;
# T5 d1 j, z7 u1 J, ]6 o, j" q+ O        }
* T6 M- s# Q3 I& c: a- r        else
2 q6 g' X. s  y3 W        {% ~( G3 l* o* H/ R6 u. L& _
                printf("No effective message!\n");2 \5 a; L% o$ X2 E0 x2 e. f
        }0 [. u" S8 C; H5 E. r
}! e+ [" J) o5 M+ X% n* R
% r) w- f6 R0 n8 t7 l4 L  K0 I: ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 C5 `# ~$ B! p) Z0 O
9 C* j  N9 H4 _# p; M& m1 Z1 r0 g) A+ g/ z

  C( y% Z# f5 G- O# T
/ c$ G/ r# G: }: y, {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-14 21:03 , Processed in 0.041619 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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