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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : ~% ^5 y- X3 v5 ^( z
. I7 x) {2 L5 c, @! ^' s6 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, }) C9 x( m: H3 v* K#include <unistd.h># r" U! f* k; K! K9 Y- r
#include <sys/mman.h>
, n  I. Q( v/ P; |- K% v# w4 W#include <sys/types.h>
  B8 ^+ F+ s2 p#include <fcntl.h>
& ^6 y& I" z9 f6 X
7 ?. l& H0 H- y, E, ^0 q' W0 m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% c4 c' B0 s1 B( l; G5 o" R
% H1 l" A; c5 r# ~- V& p  Ktypedef struct8 y! y* _* Y+ o7 Z! K
{) T, G2 f& A6 F' _$ ]! G" n3 N
        unsigned int a;
- Q# I& m4 X( H# p        unsigned int b;
9 @  ]1 m4 H- o3 E& g        unsigned int packet_cout;
  h- d/ A/ d/ N: V: C* ?" F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' P( v, M* a: P" Y) Z" N8 l# m4 s2 [& p# j! a( p0 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- n% x) z5 q" f
unsigned int count_copy = 0;. U: y0 ^, h0 P2 I2 n) [

$ |( S! l& e: U4 Z: q" m9 ~6 v9 O$ _4 P% R
int main()! G, h7 d+ }2 j( b& |
{
$ E) Y3 p$ ^+ s4 R2 g# _9 v0 y' v" |        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J" d) y( F( S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- `5 D4 b1 _% h& |0 v9 l

& b0 C# l: V; a( o- z- h  ~6 N        while(1)1 D! G* }; `" O7 b" k( A
        {' X6 J" H+ u1 z5 o; u
                read_MSG_buffer(pshreRAM);
# i* d2 d. i( k0 X3 Y        }                % c! y( p. c7 N6 l
}" q: N; i( k' ^8 U
( z/ C" t9 o. Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): `$ d. }1 H+ }( d. d; k
{
& z8 ]) K6 H. K. M1 P" a        RX_MSG_PROTOCOL buf;
1 n: u  l, ?4 W        
: M5 K2 G0 y0 }8 ^$ ?5 Q        buf.a = pshreRAM->a;; r, G/ e# s. G) E1 p  d- P7 x3 S
        buf.b = pshreRAM->b;
) K: s+ j, _+ W4 t3 _        buf.packet_cout = pshreRAM->packet_cout;
; t, {# y' }) O: c$ p4 `1 A          E+ Q6 N7 V! {" s/ Z2 {
        if(buf.packet_cout != count_copy)
# }2 f# T7 {0 e9 U; S2 k, \, l        {
3 O# n5 \8 \# a' ]4 ]                printf("a is %d\n", buf.a);& x2 Z& o( B: U* z
                printf("b is %d\n", buf.b);
, D" ^3 e  U$ i5 J2 K                printf("count is %d\n", buf.packet_cout);
3 k# H( q" O( V- i( D9 s                count_copy = buf.packet_cout;
' r9 w4 U1 M! j  W  ?2 r6 ^        }
( T( ]" d4 c" C8 S4 d        else- g' o1 q! M+ d# n& s
        {
- o8 _& c6 s) m5 w- r* v                printf("No effective message!");1 s# _4 A1 F2 l  H
        }( p6 G; M8 |. N( Z2 ?1 x
}
. [8 h! c& H2 _0 f' ^2 d4 J
3 k- Q8 Y! H8 f& Z. W6 U" `3 @# Y3 w: I; H$ r; r8 j8 k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 @+ f3 _! S( r0 c  |
使用下面代码,对内存使用了mmap函数后:8 T" {; H/ l' T$ m% I/ S7 e' q
#include <stdio.h>
3 |/ U% u' q5 a) a#include <unistd.h>
. n5 A/ M. ~* P' J7 N#include <sys/mman.h>, j1 h3 o- q" \: z
#include <sys/types.h>
8 b# `: r/ O; H) g#include <fcntl.h>* T, z& D5 t" w, j

: k( I, h. P2 A; J) R9 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)1 K0 f5 }" M/ {: @3 z& s9 X
#define SHAER_RAM_SIZE         (0x20000)   
  A1 Y0 x' Z6 E9 G4 ]7 }  q: \6 x% I* w+ C: O/ j
typedef struct8 T* K% X7 i. i! X
{1 J5 ~* q) x/ n  e
        unsigned int a;- [1 D; U8 S6 R9 r$ f2 b: T
        unsigned int b;" h) J1 I6 A! X- w/ K0 ]8 D. d
        unsigned int packet_cout;; _) F( {0 s. w% ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) R( C! j/ x3 ?2 W: G
8 t. M$ {3 S# {$ ~2 `* h
void read_MSG_buffer(int *baseaddr);. Y0 |# w3 _0 J
unsigned int count_copy = 0;" G; c' m0 j2 v$ _
% T" j8 U* ~4 k( p
int main()) ^; n  e# o  P& W3 f  d, q* w
{  f' }: H0 G" `% W
        int fd;! B8 t7 X& o+ V. l0 a
        int *mem = NULL;
/ {6 ^7 I0 _! [- ^1 w. H' y
: B% V- [- T' C3 l. ]( ]0 B        if((fd = open("/dev/mem", O_RDWR)) <0)7 s" n  M, H9 c7 ?, u
        {
, m+ x' z4 Q( v( ]                perror("open error");
! s6 c3 i& `& P                return -1;; Q% {* s7 n! S" Y
        }
  N, u* @2 ?0 \- N1 z8 D        
+ H+ v, _# z# B& A) R6 n1 e; N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 \3 |9 ~( l: X5 r& i
5 P" ?1 ?2 t* S        while(1)
, _: l% R) C$ v5 d        {
, V; |! E7 @9 F$ p6 k3 m                read_MSG_buffer(mem);
7 f) x: b! V* ^2 p4 D        }                ( k* Y1 ~- Y' x. k8 M
}4 Z4 u  u4 z6 o- I
' M( @# E) |) j' Q: d- E/ n
void read_MSG_buffer(int *baseaddr)
4 e4 J8 _3 X+ A{8 ]1 g9 A& s: C4 @4 e2 r
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. J: {4 r8 K  \8 N+ I, b5 \+ I
7 ?0 P) x! I" c        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. Q$ u7 c# F; L3 Y

2 s2 F) p2 a4 H: z2 t" M        if(pshreRAM->packet_cout != count_copy)
4 C; F) f1 o/ \: X: A. B1 o6 P" K, o0 s        {/ s9 n& _; O/ e% f& Z5 K% a
                printf("a is %d\n", pshreRAM->a);( N$ }2 K# \5 s0 {7 D
                printf("b is %d\n", pshreRAM->b);" f4 [; b! {- K2 p9 V9 S
                printf("count is %d\n", pshreRAM->packet_cout);
! q. b% L1 y# W. X$ s  z                count_copy = pshreRAM->packet_cout;
5 X4 L6 A; b/ k0 C& u* U, Y+ b. T        }
9 }- ^4 P  ~- j  R' L8 ?" R        else+ ~4 W. Z9 @: [4 ?
        {5 ^2 r  d  }% N% R6 ]1 b
                printf("No effective message!\n");
/ t0 e' N! N; G' z4 ^' S7 b+ K) J7 @        }% l% K% n2 v5 V, ^5 ^
}3 u" h$ b2 c. f& i6 C

) y6 v" C" Y+ ~  q" n& y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 X# m9 Q# b5 @3 K9 l# b" N; a% c" n: z8 p. s8 N2 F7 V* `
+ G2 W, w* X; Z8 P
! w& I" T1 d6 ]7 z2 a% F
1 V0 i4 y7 p, U8 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 10:09 , Processed in 0.043757 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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