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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ K$ }- d: }. C' f0 q9 k, z& r3 _$ Y7 l% M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* S# [: K! o3 W! v' ~
#include <unistd.h>
0 `" I; t  B# F#include <sys/mman.h>$ D$ @% u) d; t+ ?; R: U
#include <sys/types.h>6 A" P$ [4 i/ i1 Z" G% T; c
#include <fcntl.h>
: W! h" ?/ f' M
" \0 S# x5 F$ b2 D#define SHAER_RAM_BASE_ADDR    (0x80000000)   " E7 p" w3 g' e. V/ l. b

! k6 D) E/ G5 K  b6 O5 ?typedef struct5 {: N' F* x; s8 X/ f; ^
{
6 D* W1 X( T  A# v& u) i        unsigned int a;& |2 S2 t4 W! L  K; G- X
        unsigned int b;
; f% R! b# O2 u. X& N3 F+ n( R$ N/ e        unsigned int packet_cout;& L9 j9 O( n0 W4 x" |6 I! H9 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ {: |* E& K+ N. K
1 X; G, u9 y7 p* C. q. Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' ~& {. d# u1 X3 w! r/ ^/ e
unsigned int count_copy = 0;$ q/ [8 p) O$ Z) c1 C% U* H

! Y' J* y( Q: r+ e2 _7 K- m  U3 {' n
9 u8 j4 g0 T$ [3 m; q. f: p' `int main()$ d) p/ D  O9 m4 @0 U6 p, N, S
{4 x3 \  @6 |- G8 Q" r& S' Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 D9 g8 ~+ B/ J0 t; l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 m2 P6 v8 p9 O3 X9 U" `9 E' k6 z( R* R( H
        while(1)
. p4 w3 \5 b; `0 T+ G) t( O! X2 _        {0 j; _6 [$ ?6 ~5 h' Y; M
                read_MSG_buffer(pshreRAM);
; a9 }2 X9 v8 N' y6 y2 E& {        }               
" o7 L3 \$ Y3 p$ [" i}# a- w& `6 C8 }8 \
' ]/ O: K4 ~$ v4 U- B# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! c6 `: r. f. t6 Q+ u( @; i{# N/ q3 F/ K0 i4 T( F" j
        RX_MSG_PROTOCOL buf;
3 l( D, B+ l/ [/ n# U        
, `( |- P/ ?1 M( v        buf.a = pshreRAM->a;8 R' W- C$ V; W/ c& n5 b1 ~
        buf.b = pshreRAM->b;/ n8 l0 |- D2 G6 F" m& n
        buf.packet_cout = pshreRAM->packet_cout;
# j/ K" ~8 Q3 U        
  C' A, E) Z$ T: j. \6 p        if(buf.packet_cout != count_copy)
  c3 Z- c7 x) \: U' b: P        {! o0 f* o5 i) z5 b5 S& f
                printf("a is %d\n", buf.a);
( z$ `! O! f; R8 s# V9 B                printf("b is %d\n", buf.b);
: o" r, X5 g2 L* ]4 J/ ^; T                printf("count is %d\n", buf.packet_cout);. K' B  y. O3 t/ ?; N4 ]
                count_copy = buf.packet_cout;5 m/ b1 y+ I1 w( A' i5 Z
        }
  f$ v. I: H, h        else( Y) H+ p  G6 A- o0 U; F6 w) `& Z
        {
% I% }7 E* c( Z) |; Y                printf("No effective message!");' q0 X4 i& C5 f. Y
        }
' d% Q1 Q, {4 |, w}1 |) v/ Y, V. N3 f
; y" W' w% r2 ]4 C
' F" ?# }. r  `8 S+ z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 H& I* ]- g0 H1 k' z3 ^7 H使用下面代码,对内存使用了mmap函数后:* C/ U6 F* L7 c8 ^( v7 z! \- \
#include <stdio.h>
" D$ L" ~" S0 [- W) w1 M/ k8 o( `#include <unistd.h>
# L1 j4 B% C2 ^* |* M; w) s+ @$ F! Z#include <sys/mman.h>3 }9 L: T) R% {! b! W2 j# p- s
#include <sys/types.h>
0 z) u0 J  L6 r#include <fcntl.h>
/ y# M. E3 f3 \3 w( y+ ^4 ]* [' O9 h& w( t1 P
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 c1 J+ y( P* J2 g% d
#define SHAER_RAM_SIZE         (0x20000)   ( F8 z) ~/ g- l# ]: B$ Q

# e6 f5 ~; `. X3 i* D- t5 mtypedef struct
" h/ s" ?: n8 M$ H! Z{
% N0 M3 C& r* A( z5 {        unsigned int a;! J2 W2 j. }% V. h0 A- k
        unsigned int b;
  k& D: W0 S) u. s5 s/ Y# u        unsigned int packet_cout;) ^8 n0 \  p7 l( D4 C* a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 n! l# w3 o% ?. E

7 ^2 a6 j6 m  V, l8 \$ Yvoid read_MSG_buffer(int *baseaddr);( s: N; D, L+ k7 h0 M+ ?$ n
unsigned int count_copy = 0;# N7 j/ @8 Q7 L7 y( n# P

1 [3 N5 f& X" j. ^+ tint main()3 |& P6 w/ \7 Y! a6 z/ i
{& @/ o; ~9 W) C) ~- I5 q5 ~
        int fd;( S( Q, z2 P  |; K! R
        int *mem = NULL;9 f$ e, g' o- \$ Q1 D( j5 q

& |% v* M1 g; U. z) k+ {7 D3 M5 W        if((fd = open("/dev/mem", O_RDWR)) <0). v  Q/ b  Y5 o. z
        {  ~0 `% o4 {& p( g
                perror("open error");
4 v" W: E. s9 L2 m# W/ P) \- z                return -1;8 b) M; S& ]& {0 w6 B
        }; ~) v5 f5 S  Y1 i: |
        
3 ?: d# ~1 J" s; a- b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 W6 ^4 D" ?- M, F2 Y' I
: f- m5 i. ^6 F- V' @" ^        while(1)
7 Y) |% D" S9 U7 H. d        {
/ q0 u: A. u& J7 s                read_MSG_buffer(mem);
% [$ m1 b9 x! m3 i        }               
) Z: b9 X# i5 V2 r}+ |4 i1 ?# W" n+ O6 U
$ D% f+ b+ J% U' b6 M3 q
void read_MSG_buffer(int *baseaddr), H* i# z! j. ~. Z& \* e3 ^
{
0 F% n9 F  s& b( M        pRX_MSG_PROTOCOL pshreRAM = NULL;
; g; ~/ _) R( C! ]; J+ j; t( Q6 q6 {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 T6 H$ Z/ U2 F" x
5 V! A4 C! o. J: o3 A- C
        if(pshreRAM->packet_cout != count_copy)7 a& Q, a2 H# k: ]" V- F9 Q* v
        {
' j* |$ S5 x1 S* B$ R                printf("a is %d\n", pshreRAM->a);# e4 n! P' A" H" Z
                printf("b is %d\n", pshreRAM->b);
5 l/ M& z) Y& s, Y                printf("count is %d\n", pshreRAM->packet_cout);
" g& F9 M% K5 P! h9 h                count_copy = pshreRAM->packet_cout;
1 [+ q! ^0 B8 V" m* c0 n/ ~        }
$ k* o# Z8 W( {, e! o7 `! Q& [        else* U$ V! G5 A/ r
        {& w' T5 [4 f9 ~; k! r
                printf("No effective message!\n");
; T7 {$ E* w1 d7 x# X        }
5 j8 Y2 a9 T8 I  Z! }8 I% @}
6 a0 S" a0 M0 q% I# l1 t% z5 R( S" W' B$ w" B& I6 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  w  P( n- A4 f- t5 `: t
7 L0 O5 K1 d) V
7 T- C2 q! ~2 ^" s: S

5 m+ T9 o) A$ S8 P$ u. R
# E$ H4 p4 \: s5 y6 z  V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 14:14 , Processed in 0.039809 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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