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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- p+ d4 t* ^6 V, P$ N
5 J+ g& |0 a( f6 S. y. K4 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( |: u/ I; Y1 w$ N6 k: D#include <unistd.h>
9 b0 L4 b" W6 {( L, Y& [# |#include <sys/mman.h>* U4 |& u; H; i& w  X0 r+ T7 l/ ~
#include <sys/types.h>& q% Q/ J" W3 m+ w
#include <fcntl.h>
5 x; j. O  ?8 b9 `8 F! a# A
* U7 ?1 W3 N0 o/ R1 O* k% W3 \#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ {# g, x- }" R; t' G% a% w
* [9 T4 `  @7 R1 V8 u1 L- Dtypedef struct, t- Y( e( \; e, S2 k; g' V
{
8 m( E  s4 P& G' h0 `        unsigned int a;
, [, ~" ~5 h. L7 l* a) c        unsigned int b;
* p5 \* V4 k4 U) V4 n1 s) T        unsigned int packet_cout;
1 E* l; R# g+ D* n- Z- g# j$ a' v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 u2 \0 b. a2 d! v$ I6 P2 }% {  |
4 ^- _9 e7 |3 S# O) |! h  [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 ^; f( M7 ^- Eunsigned int count_copy = 0;
! X4 j0 C7 U4 v0 L( e% L; |8 H# N5 Q9 n
1 |4 g' v; D2 Z  H0 l( m
int main()
1 H0 j4 \1 j9 r( \; y0 ~{
7 y: U( x' z& i' R' C# c9 J0 T        pRX_MSG_PROTOCOL pshreRAM = NULL;; p9 k6 {/ B9 m. }* E+ P6 e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 _$ p7 j6 u3 c) `% f  \5 |$ P
8 p% F0 k8 ?+ X$ }4 ^8 t. U
        while(1)0 u9 U' p. a3 W+ E+ A. K, K7 Y" @
        {
! V" w( I& Q( N* H8 u( ~8 P4 x                read_MSG_buffer(pshreRAM);" P' o6 f/ Q$ g
        }               
, t( L5 O" G6 R+ b, I}
* P. ~1 V% F% ?7 X/ S
) E7 `9 l$ R/ L0 b) k9 S' W" Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* q. T! ~* v/ H& n6 \{" Z1 J  x) j+ ^) f9 ?# ~+ @% Z
        RX_MSG_PROTOCOL buf;, m4 v/ Y" Z0 w, v
        9 S+ m+ d3 Q9 W6 j' D
        buf.a = pshreRAM->a;$ d$ T/ e' s- f2 L8 y; i$ Q
        buf.b = pshreRAM->b;
" Y& k3 M7 o- o! I% T' C        buf.packet_cout = pshreRAM->packet_cout;
7 S9 X8 a% D3 y" ?* V# U  F( C        
. E+ R. @7 Z! V& S& ?4 }1 J        if(buf.packet_cout != count_copy)) x$ {) N" a9 I* ~4 s
        {
  W& x' k4 t( r$ E# m2 _; R                printf("a is %d\n", buf.a);& |! m( A. R& o
                printf("b is %d\n", buf.b);
* ?1 |2 v3 k! x0 J                printf("count is %d\n", buf.packet_cout);2 [% x( i+ Y8 n. C* N7 [
                count_copy = buf.packet_cout;: s4 e# S" E9 [1 C
        }
& ~* ~9 i$ r9 j: J2 q        else
  ?% |, D. c: h        {
: t4 M! |" e5 M8 |5 Y+ m& D                printf("No effective message!");1 W) {! c& U% G) |; m7 P% F1 ~
        }5 k0 Y7 E# e' q( [! p) I1 v
}. O9 n1 H& |8 a, x4 M/ `2 `

# l) T4 y3 D2 V/ g) K/ `  i+ j! b0 m2 V( D$ t1 x4 x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ K% {0 i- w0 e2 H; ~
使用下面代码,对内存使用了mmap函数后:) u( ?, ?- I# U3 B, w
#include <stdio.h>
: O4 Q! t5 [* _" G#include <unistd.h>* M$ e" L! I% W3 `" s' f
#include <sys/mman.h># {; M/ z9 a, k& v2 Z$ A1 @6 O
#include <sys/types.h>
% k) Z( e0 R+ @+ A" b#include <fcntl.h>
( ~0 ]  P+ g7 K( i
2 R( Q! h* h. {) p2 B0 J- ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 Q9 p1 `5 T$ E9 X( C1 \#define SHAER_RAM_SIZE         (0x20000)   ; ^; e: e' x; c( j: ~
* G2 v% J" s+ F, T  v
typedef struct
, q: Y9 ~$ U2 s0 }{) z$ d# E: [( u% Q( p
        unsigned int a;0 F) R- y0 v2 B9 T
        unsigned int b;: Q7 n2 f$ r. B/ s$ ?( {( v
        unsigned int packet_cout;
' Q  l2 ?8 n5 \" f8 L# J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ k/ s7 ~! I: Y) x$ J, s) ]! X" V3 E" V. h
void read_MSG_buffer(int *baseaddr);, z1 J' |2 d; t, d) W9 @+ P  w
unsigned int count_copy = 0;4 `8 E9 Q9 t- M  ?* X

* Z2 j# T$ C: ^4 r: E) c( dint main()
* ?2 ]: J7 q+ H: i( v{3 ~4 N3 ]9 n0 _( {/ D
        int fd;
3 z; \' ~" P/ u( |% L" U        int *mem = NULL;
& g  S: L' j% l6 z  i  c# R! }8 {% Y6 [1 m3 u
        if((fd = open("/dev/mem", O_RDWR)) <0)  H% O; {) @2 U4 s" m3 I
        {" y$ c: N6 V" ~: {. C+ U
                perror("open error");
6 @0 L( K( J8 |                return -1;
2 C4 N$ z! E3 u* W2 z        }
2 }* Y  b' T0 T+ e8 h  Y5 }        
3 ~* i8 k1 S: S! C$ N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) e  H! h; C. j# r$ N/ E$ }! C+ K0 Y& R+ V& r+ P2 y5 G
        while(1). E- d9 a! R% Z  c; V
        {
$ ~! t, W. T3 V) W1 c" W                read_MSG_buffer(mem);
' l7 ^& j( t/ F, y7 O0 D        }               
  l% ~5 \4 a4 {$ Z# L8 b0 q}" ]# R8 E: @, k
7 \, J, x1 D7 K8 j- H1 H8 \6 {
void read_MSG_buffer(int *baseaddr)
9 b( ]$ L$ E% h6 M3 q{% a" ?% D2 [4 |8 s6 m6 x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& u% }6 T& M$ B7 C" ~; {2 m6 d5 a( ^  O7 H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* P& j' u  D7 n8 v& x  H: W

6 u) E! X8 z" d+ V2 B        if(pshreRAM->packet_cout != count_copy)
: K/ T% S3 K: F9 e        {1 l$ Y4 M% v1 D6 d
                printf("a is %d\n", pshreRAM->a);
; n" t+ I: N  k& q# Y7 c                printf("b is %d\n", pshreRAM->b);
( V" @( G3 c! Y+ q' ?                printf("count is %d\n", pshreRAM->packet_cout);
7 W; _6 J7 U2 E9 U& [7 d, J, R                count_copy = pshreRAM->packet_cout;$ G8 D# B4 n1 M4 U' M2 L
        }) C; [1 |& V0 z; w% ~6 j4 L; K
        else: `) c& U- g: A6 h% D
        {+ ^. L+ l& o* u# `5 T
                printf("No effective message!\n");
; s1 [  g/ Q, ]( L8 B        }
$ ~3 o; ?8 y1 C  B5 {4 J" {}( b  z, C, W+ x7 ?1 B. r5 l

" ~  j1 H1 S" j( G/ t6 Q/ k. z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" f" f7 v9 c. Z+ W
1 R/ ]  F2 V  ?6 i; N
% w" f5 n% |/ x. |. X9 r

8 E  _# M$ H5 W' U
% Z6 ^2 o/ [2 y' U& u* c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 09:24 , Processed in 0.041193 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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