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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 `2 b+ z$ F- z" z

; @5 Z/ {' M  z  S/ cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 U( A1 C5 \1 M6 E3 m7 O, a  A
#include <unistd.h>
* V. q- ?+ U$ S# ]! Q7 [  \#include <sys/mman.h>- T* @( i" j8 Y! x
#include <sys/types.h>3 t6 {. L2 h: O+ W& V5 M  g
#include <fcntl.h>
) ^/ Q6 q" z- X" S/ b9 }
: z* C4 F' [. {7 u4 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! s6 v' |) w( l' ~, G  K' ]' c% L9 d5 m6 }# n  {1 d1 b
typedef struct
( e! N0 |3 D4 L1 v' r{
9 ?" G( E1 W' I2 R# m( O4 r        unsigned int a;
. R* Y6 I2 H) T6 R# [' n  o4 w        unsigned int b;' _+ @+ Z: t" `5 }
        unsigned int packet_cout;/ w, E! D' o7 [  N$ E. I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( v0 K; I0 X) R" X4 w! C0 r+ B' U+ @& q8 Q% w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, q+ [5 [! |1 B" t
unsigned int count_copy = 0;
. d6 W) {( @2 N) A" y1 b: v" L; C2 I
2 S: T# t* `, C1 [7 C8 y) Y
int main()
! f& |! O4 l+ i1 C# ?{
9 o1 L% H+ }$ x9 E# ]6 z        pRX_MSG_PROTOCOL pshreRAM = NULL;
# U8 s: W/ O4 j; s- H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) p/ d# Q4 \6 I( U. z/ d

$ L9 m* z, g: |6 U, v2 {3 O        while(1)8 K4 f* G& d# E8 k: }, L
        {
0 o$ K2 W- O- a% L) N( d4 d/ A                read_MSG_buffer(pshreRAM);
8 M0 h! [7 a! k# d' j        }                ! T7 ]& N  E6 ?
}
1 w4 X8 J+ K9 T
" [' {  c0 Q. \( _# ]( j/ _; tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ o" E. a! b  L2 I0 L: t: b3 x
{
# ^6 w5 k. ]! M& X2 E' `        RX_MSG_PROTOCOL buf;6 ~1 B- Z% u7 v+ a
        
& I$ B1 s- m" M- i        buf.a = pshreRAM->a;; p- S. m0 R0 b- R  s  c- K- F
        buf.b = pshreRAM->b;/ j, ^: x( `9 A; ?1 n
        buf.packet_cout = pshreRAM->packet_cout;
; w7 U( e; o3 ]% u+ ?        
& e/ ~- b8 S' `        if(buf.packet_cout != count_copy)
& @" b# P; J+ m/ G$ u        {5 O% K+ H7 I. l$ K5 N
                printf("a is %d\n", buf.a);! ~5 N" V$ \$ H" g, t: O) F
                printf("b is %d\n", buf.b);
& l: ?. O5 v& V1 `, J                printf("count is %d\n", buf.packet_cout);7 A7 y6 H, j, G" v1 E
                count_copy = buf.packet_cout;
: y" P: m% u* k7 L# c        }% _# _/ Z! J6 U
        else
% l  u$ S% [0 O& Z3 y0 @* I        {
" e; n8 @7 b" P- ^" ?# [+ y3 E                printf("No effective message!");1 h1 G, F/ `- Z6 O  d
        }7 u' r. P1 Z/ U
}3 W8 O( _" O8 N9 K; d' Y
- c. d% ?  @, B. w
( [0 V8 C6 a+ \0 d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 S5 h2 k* X# a. }5 K4 N: L0 W使用下面代码,对内存使用了mmap函数后:5 L. H1 g  [5 e" ?
#include <stdio.h>2 V2 ]) f5 K$ f' K# `" u
#include <unistd.h>7 y4 c2 k9 E% C
#include <sys/mman.h>( G1 i' r/ C" M: s% _
#include <sys/types.h>
/ t5 j0 E& P# E7 H9 B#include <fcntl.h>8 w1 `! F/ j. T% B3 w! ]3 ~! J

: }" K0 H8 t  |5 u5 S#define SHAER_RAM_BASE_ADDR    (0x80000000)& d8 r' A. Z( ^$ c6 e
#define SHAER_RAM_SIZE         (0x20000)   
; j! }( H. J3 @4 f& f" _) J% S6 |4 f4 F6 n0 V& d
typedef struct4 ^% P, p3 s- s* J! B6 W
{8 C; P, X7 \4 F9 K8 `  g$ s6 J5 S
        unsigned int a;/ f) U' y" c! P& _; a
        unsigned int b;- A2 D2 |  F0 K5 q0 M% a
        unsigned int packet_cout;" h$ j% z$ [/ H( |" g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: j7 `$ K2 {* M+ F6 F- e
$ y3 J* \4 H4 u. kvoid read_MSG_buffer(int *baseaddr);
# m4 x2 P* i8 V! d! t( junsigned int count_copy = 0;
5 }& s. |9 f2 s1 |* \/ h
8 c$ L* Y6 K* N. E1 z# J; S1 s# {int main()
* n9 z$ A$ c. ?: A# M) p{
, N( n$ @* d( w        int fd;
& H+ l  _5 I  z3 ^  R: |  v% n) W        int *mem = NULL;
" J' T% [( W% a2 a: l: `1 O8 S/ X/ K! R+ e# m% L" C+ b6 q
        if((fd = open("/dev/mem", O_RDWR)) <0)
  x' {2 r% N+ s7 K7 i        {0 e, e$ W% z  ?
                perror("open error");% b% J, u4 g6 x$ O5 q# [8 c3 y
                return -1;6 j$ C9 m" k; X- l4 v7 Q$ A$ p
        }) d9 J# z, ?4 _5 W3 f% i' l* M
        ' c3 L2 L: v0 J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' e3 f3 O7 D+ `% V/ ]
2 D7 A8 a4 V% M& C) ~" p        while(1). q" j- h- T: n4 ?8 N# c
        {
( i1 R. \/ O0 b& a                read_MSG_buffer(mem);
! l$ p/ G( K2 T" A6 }        }                , j2 @3 S+ r' J4 `4 J, ]: `0 H
}
& }, Y  e5 I: A. b
. {" l4 W, H% ^void read_MSG_buffer(int *baseaddr)
; h' |6 C/ w% E# e: y  |1 C. B{' J  C5 E3 S5 \3 w2 m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 C% J1 a* s" ?* O" T# g2 M
" V" X: w5 u. x/ B2 F% G: N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 A' u7 [/ Q/ e4 J8 Y

( f# b% _: q) S5 l( v, C        if(pshreRAM->packet_cout != count_copy)
/ t  ^. ?0 T4 V" F- \- M7 h6 }        {  I, }* A; i  P2 b  O
                printf("a is %d\n", pshreRAM->a);% e( A1 C$ \+ |
                printf("b is %d\n", pshreRAM->b);
+ F7 g3 ^1 Y9 @                printf("count is %d\n", pshreRAM->packet_cout);
1 ~3 Q' K( O: b! S5 P7 U                count_copy = pshreRAM->packet_cout;
7 D; W, z; p/ V/ N        }9 P% i9 S( r, K* i
        else4 o2 s; H4 y# ]
        {+ @2 N) y8 B$ b9 L, r, b
                printf("No effective message!\n");
( h( P5 R: v* f3 t  c2 z$ j        }
0 h/ {+ e$ i2 o" y}
* B# Y% O9 ]! a; q
. G) R# z; H/ W, D: T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! y* K! o1 g6 U# H) c' ^1 m' [
  @% {* X1 N+ |5 J4 o! H

# l6 |6 L& c# T' Q% Z: |
8 h9 ]  T5 I8 q0 x- J' M5 A; `2 h6 Y: I7 y/ `+ f8 t% o  @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-25 13:19 , Processed in 0.040591 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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