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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 ^1 I' @) e8 p. z# b. ?, E/ G: N0 a  Z+ B5 R5 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ W7 x' F1 H' O. k8 ~$ w
#include <unistd.h>: a: c0 a8 [5 }6 C/ U! {) K3 P
#include <sys/mman.h>
: w& l7 l( |4 S  u#include <sys/types.h>
9 w6 J) ~+ Q% }& ]#include <fcntl.h>. g9 [# D- v% g3 \* \& ?$ W

9 O# W+ v3 Z& ~9 L#define SHAER_RAM_BASE_ADDR    (0x80000000)   - |9 ~! L$ n* q- [

" y; J$ c, u% H8 Ztypedef struct" S. W/ y8 A/ x. s# C% I
{
% B4 Y- J, B3 `4 W        unsigned int a;
( r: S. q& Q$ d/ i! E' C        unsigned int b;. `3 u7 e& i/ j4 M- R) n/ u! m3 o7 m
        unsigned int packet_cout;* s! Q( v% C, S5 q" d  Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 B+ g/ Q, V; h+ v: m+ H. ^/ A* F/ O  I) e2 R- J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 l6 L2 Z/ l2 ~$ X; g6 u
unsigned int count_copy = 0;# M2 c: u0 r5 M) ~
  Z& L' P4 r  l8 U: w$ ~( \2 c6 l$ Y" V
! e0 ^9 \1 M) k) Q# J( T
int main()
0 t4 T0 @& g  ~  X7 o% N. X8 Z{
( C% ^$ B( N/ z- v0 S5 c' v9 I/ l        pRX_MSG_PROTOCOL pshreRAM = NULL;! [/ e, J8 W9 w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ f, H, I" I& i
/ l6 W, P$ z2 Y! W7 u# v+ [        while(1)) q8 s+ t+ ~( e8 x5 b3 r
        {
3 F& o( x  Z% F9 o. m  E9 e/ s1 U5 D                read_MSG_buffer(pshreRAM);
. ]3 s% V) r$ F! a# ?        }                ; Q3 d7 L9 A% J$ _3 i
}& j6 e) Z; ~9 y0 C, j5 b
; ]- L# T" V- ^6 C- @$ @6 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 q* d& K) P2 J; K( c  G- t, Z2 _{; ]3 E; @3 p  J$ y/ n; b1 c
        RX_MSG_PROTOCOL buf;
1 u  j  ]6 y) ^, I7 {        & Z4 z. {/ L7 {0 |
        buf.a = pshreRAM->a;
& H4 I% ~7 s7 a  F; _4 P, r        buf.b = pshreRAM->b;
9 i9 h9 Q% t' Y$ d( W        buf.packet_cout = pshreRAM->packet_cout;& T5 g5 f# ^# ]# E# p; Q* r
        
, V: u) ?5 P: q( R0 n8 Z: }6 e' d: i        if(buf.packet_cout != count_copy)3 D1 @9 o% `2 i* E* x9 ?
        {% l: c& X! F; [( j! b
                printf("a is %d\n", buf.a);1 B6 W6 E8 l+ i( ]6 ?
                printf("b is %d\n", buf.b);2 ~- r8 @* _  n. Q
                printf("count is %d\n", buf.packet_cout);9 U  M- O; Z) f
                count_copy = buf.packet_cout;# M7 N% n+ u& I/ q- t" b$ o- V
        }" i& L0 z" U% r+ T; k
        else: y% a$ y) [. c6 a; b
        {4 H' A; m- i1 P, r
                printf("No effective message!");# v% N6 y% ]" r
        }, I, a0 ]& c2 L, J
}, a% g3 F1 j% r: ]; c
  A. C, i0 Y+ J5 w( ?

9 g: H& z+ j; M+ R3 f, t% n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, A. E: R, w  c- r( K$ |9 K使用下面代码,对内存使用了mmap函数后:- @) Q3 Y. f9 b
#include <stdio.h>
% d4 y' [& y: u; z3 L' N$ ?#include <unistd.h>
1 ^6 `8 ~9 N9 T3 ~5 n9 p) N( Y#include <sys/mman.h>
  E3 A1 l% L6 P1 a$ u  I( E$ G#include <sys/types.h>1 O( l6 e" K  `2 L0 p
#include <fcntl.h>7 u' ^1 Y% j8 z$ P( h' Z/ S
6 B3 J4 }" T" V' g6 n1 @
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 d9 \! x  ~! v8 u; o$ U( H, `3 c* f
#define SHAER_RAM_SIZE         (0x20000)   ( [+ b3 D1 m6 L5 T3 o

; e3 W9 A1 v# O" j% k: Atypedef struct6 G; i( g2 y/ h8 K2 q" `
{+ S  f, f4 J' \( M1 |  {, j6 B( F
        unsigned int a;
8 ^# W# f  J5 `$ n9 |        unsigned int b;( m- a$ a+ E9 [' M
        unsigned int packet_cout;
4 a) Q, H- m" L( l# d, n! o+ n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! o/ c, q- O$ v" T& x" c% ~

/ x: z# b6 m) k4 d5 Ovoid read_MSG_buffer(int *baseaddr);
4 h6 e" g$ {* ?# z& dunsigned int count_copy = 0;$ U4 }( K+ [1 e' \4 }* T0 S
7 H+ f% @6 k' e9 F  I
int main()
2 `8 S; q, I' t  r1 ~{
; I; T7 r- R4 C5 q" m        int fd;7 \: @0 y6 n$ E, p% Y; s1 A
        int *mem = NULL;
$ i4 d& v" G: |/ W/ V# ^7 M. U7 ?" z: w' u- j7 Q
        if((fd = open("/dev/mem", O_RDWR)) <0)! T# y* n5 Z! Q9 w, N$ q
        {
% J" p% q( ?+ G9 S: G# \                perror("open error");1 T, a+ B( L' p( D) h8 n
                return -1;
: M9 r6 E4 n0 n        }; \1 r) C/ ?6 L
        
( R3 ~- Q. `$ O2 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 E$ G% }" L  Z  E  |( O; p
# q. n, C: ]1 |5 s0 M        while(1)8 C/ s2 c/ ]$ s" d
        {
8 x+ G1 z0 }' n+ q- K                read_MSG_buffer(mem);" b) c. _; e- @; j% m6 y: h8 L5 v
        }               
5 y1 y; }8 A# o: R}( {5 f1 O+ S7 S
3 T5 `1 p; i9 t5 F
void read_MSG_buffer(int *baseaddr)
# B! r6 K9 ~1 O; C5 @{; l( s  }8 j" n6 u7 E- z
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 W" p% O" [& j( h' e0 `/ z- @

5 t# S! c& j# M& E/ K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: t" I. c) z/ i8 H
$ o, y8 y6 s6 U# q" E        if(pshreRAM->packet_cout != count_copy)
. p% [/ o, V; P9 {% O        {
9 v; l4 v" z9 o' g+ m                printf("a is %d\n", pshreRAM->a);) X& v: S/ D4 J' l: N
                printf("b is %d\n", pshreRAM->b);
6 K- S7 W/ s+ d! A: l* {                printf("count is %d\n", pshreRAM->packet_cout);: s1 P2 T6 u" N
                count_copy = pshreRAM->packet_cout;
2 ]+ t4 f; T: t; p1 ~( |8 V        }' Y. j2 X7 `; U5 }( k; d
        else9 w2 C, c3 H4 q- W
        {! |, b5 [# P5 O* [9 ^; }1 v% D7 b
                printf("No effective message!\n");
/ V& i( u, R" j        }
/ {: ]  o- q: ~1 d4 G! G+ w6 E}! g( r# V: W) `' d9 I5 \" A7 Z$ N

5 `" g* \& @# f3 ~8 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, Q  z+ B- S1 ~: R  i* |
: ?" a0 ]/ R" {, z& T. u  V0 e/ ?
# j& V* X6 ^( b/ l& o2 s% d
3 f6 j- F. t7 o, b/ B" F) i$ X8 ^; ~2 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 03:35 , Processed in 0.045968 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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