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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 M& p. \, r. \/ n
& b# F3 a; y* s& C0 YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# I% g- ]: ^8 t& R% X8 R$ i#include <unistd.h>
; T/ A0 E3 ?0 K1 d' v+ T4 E#include <sys/mman.h>7 y: P' v$ z# ^
#include <sys/types.h>
0 n( T5 K1 d3 ]# k" X  H7 q#include <fcntl.h>
7 U4 s+ Y1 l+ \  I) [+ a+ i$ d; ~2 Q7 ?& q, ?- C- v( Z+ A
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; w4 b6 ]. L+ m) ?7 @9 }+ `, \- g0 \6 ]( O, o) Q) k" w2 R
typedef struct2 ?; E5 B  a5 z( O8 @
{; t$ ?; G0 ^1 n
        unsigned int a;* v3 W5 m* h& r
        unsigned int b;" o1 B% y8 ~8 q! w6 P. k$ c
        unsigned int packet_cout;
7 t( }  s  V4 W8 d/ _" |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# w8 j; ^  g/ c* O, }2 Y0 A* Q" b
- w3 O# D" N: T" K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 p3 U' f) \" ^; `0 @( u* @; z
unsigned int count_copy = 0;* }" c$ O6 _+ G" N. ]& ]4 v3 x

: s/ N9 U! p1 o3 x6 `
4 F3 F, `+ {  u+ @int main()$ t' I# s( l& l; ?7 _
{* `1 L/ @4 D; l" w2 L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 n1 j, m# {; E* y7 a0 S2 I7 G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# {; Y6 }* P/ n# C; i3 A

8 E, A4 w  }9 i        while(1)/ {& p+ i3 j& e: `- E2 J/ w
        {
2 z: Z2 b/ ]% t                read_MSG_buffer(pshreRAM);0 j. `/ Z( l# O# e/ q
        }                ! {) f2 X+ Z1 {/ O4 L
}
+ Q6 P- g7 x  K2 @- n  A8 @: p* u: M$ w% J- n; j- _) |4 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, [* @  j! e1 x& v: q{
' R( v. e8 d- N  @0 Q/ z        RX_MSG_PROTOCOL buf;
4 D/ V! F6 L* t4 A+ X0 m7 G        " ~* I0 P1 @6 w5 B5 l
        buf.a = pshreRAM->a;
5 N( j6 c  t9 p        buf.b = pshreRAM->b;+ \+ N2 ]8 S2 U$ m! z5 K
        buf.packet_cout = pshreRAM->packet_cout;, U3 g2 Q# D4 z& p: u) E; T" }- \# @
        9 x; r. a% w5 ?& i! [
        if(buf.packet_cout != count_copy)
3 f, k- G) q" X6 ~$ E( V; c        {$ d  P8 z3 v5 I, s* B1 Z
                printf("a is %d\n", buf.a);
4 q( @; y3 z* X0 I% ?9 x                printf("b is %d\n", buf.b);, f$ `* T$ y9 M; s0 Z6 T- [
                printf("count is %d\n", buf.packet_cout);
1 p4 y2 {1 Y6 j& u$ c/ w& u0 }                count_copy = buf.packet_cout;
  a. G% O5 w7 E$ v9 q        }
( N/ i5 N( W7 R        else; N- g- W* E( _. w
        {/ q% [& B) y. K
                printf("No effective message!");- M" \% R" l. R4 X# i
        }, Z4 g5 I9 f5 H! `& v
}8 o  D9 a/ O# q* e; {

' e) l, ?' V( M, u* Z, `* ^2 d* o, {% V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 X0 ^: G  E$ B1 T使用下面代码,对内存使用了mmap函数后:
) i* s) r! K1 C#include <stdio.h>
1 Y# ?/ {% [' J9 p+ j) h#include <unistd.h>
0 m& I: y& y& z7 E3 N#include <sys/mman.h>
% D. y* w8 Y  v+ U' w% M2 H# `#include <sys/types.h>2 w4 X% V  ~$ Q8 W: X7 i
#include <fcntl.h>4 o3 x0 F$ x5 o) B

" N& K3 U, l2 v, i8 m4 B. n" o% \#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 Z( O! }0 Z! A#define SHAER_RAM_SIZE         (0x20000)   
  \# W+ m8 O5 s( T2 Q8 s, E; P/ _. e! S  @* _
typedef struct
6 u; @: r8 y( V  n" d) |1 y5 e/ T9 k{1 g- ?+ {, R' \+ d: X; \
        unsigned int a;) W  ^) s# p( g( b
        unsigned int b;; J2 ]1 P& A3 o9 f$ H
        unsigned int packet_cout;  ]4 M$ p; t0 K( o. g7 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# a% r" K; j: z2 ]9 n5 W) c. H0 a- z

0 @6 T3 J2 v  o8 Y9 Cvoid read_MSG_buffer(int *baseaddr);
4 T- _1 t7 B0 t) O% Bunsigned int count_copy = 0;
% {$ u9 B* @7 p* _1 k: b
, j& c8 L  H/ J9 Q1 Sint main()
0 ]) o- Y0 }+ z/ i; }{
- x: v; y: n& V( F- G7 [. H        int fd;) ~1 X# H5 S5 s# y0 U) d
        int *mem = NULL;
: ?7 v2 n+ M6 t9 [4 S' b& f& f; d
1 e% y, u3 e3 n0 D  Q, R8 a        if((fd = open("/dev/mem", O_RDWR)) <0)  v: H% q) y" Q. Q
        {  _6 O$ `4 w6 R. s2 b& \/ W2 B
                perror("open error");
8 G" j+ _; y2 y. H+ R0 B                return -1;
/ D' z; A1 c  o9 V/ m( J- ^        }
1 Z/ B/ I9 h9 l8 ]' s: x        6 O& i& \# t+ Y8 x# S1 {1 e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 n. f/ m4 Z8 G9 x' p. R8 t$ U# p9 z# X( _$ W- a
        while(1)! F+ U% h' [, M( }. \7 P
        {
' N3 X7 y7 e. t3 Z- @. ~$ T                read_MSG_buffer(mem);7 Q" h  m, C" Y6 a5 t4 i5 y
        }                4 m; P$ \, @/ h' m  _' [2 M4 ~% W
}
) W+ v: a& A1 n+ B% u3 e' G  }& R/ ^  z
void read_MSG_buffer(int *baseaddr)  g3 I# n, p! y9 n4 N
{# ]* J  X8 V! ~8 H% b( d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) I, R4 |& y; J# i' m4 j( a* s8 A% [4 L! l) ^! {8 c- m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 }  F$ }2 c- E  r1 k

+ d% ~% v! _; H: c: ]  ]! J) S        if(pshreRAM->packet_cout != count_copy)6 f+ l/ Z2 ^5 K& a
        {! E* q8 `, |, ^: D, w9 N1 v# c* i
                printf("a is %d\n", pshreRAM->a);
/ c/ S( K; q2 l# j) z                printf("b is %d\n", pshreRAM->b);3 K) m+ [: f2 ]" R4 z$ l; K
                printf("count is %d\n", pshreRAM->packet_cout);* u% ^7 P0 b, A3 }/ r' A
                count_copy = pshreRAM->packet_cout;
1 v0 d! u7 s" }, T# |( W) `  S: z        }2 }0 e0 t! @1 t- H
        else
# ~  ~0 c2 l) x( r' e' F; T6 d1 G) s        {
0 P2 B1 S  y. R, M  }* r  s4 ^                printf("No effective message!\n");+ L6 p  N$ J8 x' m0 G2 I
        }
+ T" ?( N! d) p; a9 H}' C1 Q* d4 K8 ^* f( H. `

% G+ \% U) K0 d# k没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& H, y6 U" y+ }4 K
9 v0 n- o4 j  ~2 ?% p8 K4 G. y" f
, R* C- s! \) d, l" l5 L
7 t" s# N6 X+ `3 r# [' h

/ i' B* y7 n- q* r+ S% c# l9 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 01:50 , Processed in 0.043024 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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