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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 E& X! F# Q8 {, g

6 s) z. U, X9 F( E( dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># |1 A& T2 Q; K' t' Q" _  ?- `
#include <unistd.h>7 Y3 m2 H% m+ ^+ D& e& u; g2 ^+ y
#include <sys/mman.h>% N/ S$ b- v/ |3 r, p
#include <sys/types.h>
# x  w9 p8 D3 \$ D8 p( M# S3 c4 ]#include <fcntl.h>0 a/ e* x: o1 @$ @) I1 l+ q' d
9 Z5 L# O4 I2 s+ W' G8 e* Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! V) Q7 d2 E3 |' u
' f- Y- @$ x/ j0 _! h" ?9 d
typedef struct, F9 G2 Q% J& w3 F
{
. G. y$ }- f% g/ z3 o5 U$ x        unsigned int a;! r# K$ `* A( M3 f
        unsigned int b;. n6 E) M( h8 x! n. }, V; h) v4 M
        unsigned int packet_cout;9 _6 J8 {$ n3 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 M. ^& X+ Q, Y1 @3 g/ }
7 f, l' {( y8 J- l# A  G+ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 m0 j. p# @& L% K
unsigned int count_copy = 0;- S" q9 O% H5 ^4 y7 v, {# m
" B9 U5 M( v/ b; k8 a0 j
& S- l3 c7 s% M2 i) w. t
int main()% l1 W* B% ?+ q/ r" z8 r* ]
{+ \0 H9 r8 M! f( N+ P% b4 s
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ b' b1 q' q6 ]1 y+ R8 J  u
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& o$ o- x4 z$ s. c5 c3 D2 o4 u, R1 f* ?) B5 l
        while(1)8 Z4 s  ~# R" A( ^9 Z" J6 F
        {
" k6 e! ]0 @- L. D                read_MSG_buffer(pshreRAM);
: l* W# q; r' e' \8 h& P$ k        }                ( |( v/ d$ `# J' a8 l
}' i; J# v+ Q! a% ?1 [/ t3 ]# J
$ A& f; j0 g$ `  X" N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 s" E4 X! r9 i{
& }/ Z( K4 Q' H# n7 @7 x        RX_MSG_PROTOCOL buf;
* [( k7 {8 k  r7 j        
3 h& l2 M3 |/ `9 @1 d+ E1 K# e        buf.a = pshreRAM->a;( o  }9 ]# l+ V4 Z2 L  j
        buf.b = pshreRAM->b;. M: a9 y' r5 Q% \$ n
        buf.packet_cout = pshreRAM->packet_cout;- N7 S8 C- p' C; C6 A/ z4 P
        1 I" U, a7 X! S6 S( S
        if(buf.packet_cout != count_copy)
# M0 ?3 P! D: |6 G# n" `1 U2 M        {
: I3 V8 k) t' ^% k' O                printf("a is %d\n", buf.a);# v' U) x: I3 e- A0 j. X: g8 @7 T
                printf("b is %d\n", buf.b);
! a# |2 A0 B9 k" Q5 P4 {# i' h& d6 C' C                printf("count is %d\n", buf.packet_cout);
4 f  S/ ^1 ^( _0 U9 j$ d! P1 F                count_copy = buf.packet_cout;
5 r5 I4 J, z' X" A: d4 A        }) z/ O  I; D: A  w2 J7 u1 {5 ]
        else
- S. B0 m* e' q7 J- N        {. q& W* g) N( u: C2 j
                printf("No effective message!");
) k9 Y  {/ E6 i# D; g        }5 A8 |/ O- W3 _3 t, b
}
% M7 Y) i' T$ N2 n
% C8 Y8 j3 m# ~8 ~6 Y
7 d2 B/ f- L3 y( G! U8 e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 ?* q8 \. _; _7 p
使用下面代码,对内存使用了mmap函数后:" z' m" A% F9 P3 {
#include <stdio.h>( z% U) e" U* q3 @/ I* q
#include <unistd.h>
$ Y2 V: T7 N& U: H8 N#include <sys/mman.h>. b/ f% T6 W% F7 e8 Z" D
#include <sys/types.h>) F" I$ }3 D, F0 k
#include <fcntl.h>! M5 t& J( ~- }- U9 E% \& H4 A; u
& ]) r* C' f; i. d# [
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 r% N( R" H$ @6 D% e3 r#define SHAER_RAM_SIZE         (0x20000)   - C6 g5 F3 q/ @5 _3 a8 _$ O
3 D9 Q3 T/ j- b, w0 r8 w
typedef struct! w. R; }6 o9 E+ g! @
{& W3 }  N9 @7 W+ Q" d
        unsigned int a;0 T8 C0 l' o+ S0 Z/ @
        unsigned int b;
3 f" C) A' Z1 A( |' z( N" K" P# S        unsigned int packet_cout;
+ N8 b1 k2 x# b" V6 U# L! }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ o/ F; _: z0 N# H; X0 n0 ~; h7 u* ]* M  T
void read_MSG_buffer(int *baseaddr);+ u$ r$ j/ {# r9 `7 D; y; b
unsigned int count_copy = 0;
/ ~# u# S( \# }. V: H) P2 K
% p1 ]8 @9 K) }) H7 uint main(): b5 Z- T" h" H3 ]9 n- P
{& o# G3 V, [9 S/ N' a
        int fd;
  Y3 e8 b8 [- w        int *mem = NULL;
* Y& u  I: v4 d  y% K5 r. b) C' }- Z& l
        if((fd = open("/dev/mem", O_RDWR)) <0)& J2 F2 j4 T0 b; W# M0 l
        {
1 S7 P* H& Z) L  D. ~( I3 D: F% r                perror("open error");5 C% r5 I& ]8 @) F8 H9 _
                return -1;
2 M$ H  O- z6 c% r: C+ b% _        }
& _4 |  V1 \) j        4 Z; n- _$ B6 \
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* d- O4 R' O, Q

$ j, z) f4 U5 L% A- n        while(1)
8 m7 I8 `8 Q2 B3 K) z        {8 A$ @- T( v) \* j
                read_MSG_buffer(mem);* z' r& u2 P# I& Q5 Q0 b
        }                , x8 Y6 d. _: x. e- V/ a
}% I# d) u# j' k, r
$ k6 l5 G: m! d) j8 e
void read_MSG_buffer(int *baseaddr)( s6 k% K% L8 F3 k6 a
{
+ V) v, x- b- R& O, H3 j& Y4 k, ?        pRX_MSG_PROTOCOL pshreRAM = NULL;0 X9 W- ?) _7 M0 U

6 ]4 i( Z; E$ s5 S* T: G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 {2 }! E: t" q+ C0 L% k" f
) _( p" @, q2 S- P- U        if(pshreRAM->packet_cout != count_copy)
, g% _* a4 ~8 k; W6 p        {
/ Y! u- z  z* H, X  \. q; E) g                printf("a is %d\n", pshreRAM->a);1 s# g, I* a6 c
                printf("b is %d\n", pshreRAM->b);) a' U+ j+ C- s: h* s$ G5 k
                printf("count is %d\n", pshreRAM->packet_cout);6 k4 ]/ X& _* Y; G0 D8 _
                count_copy = pshreRAM->packet_cout;# y, R8 n; F& k! h5 X! ?" w1 B) q
        }7 G& n& `, b4 w+ ]( k
        else
7 j5 ?  }2 p8 E/ Y5 I: Z/ c        {
- ]' H0 N2 l+ R                printf("No effective message!\n");
# P- u( j7 Y" w3 G# o& X        }
- ]2 }* X# R/ [8 U" f9 _) w}, I0 s! f# y$ S; u6 N
0 Y/ @+ v/ H' T9 u  \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ s7 L" q4 F6 R" ~! N0 G
! _, }4 ]+ W; f

2 X: f+ U% \& ~, N
' E# c4 G" l! F" {- s+ K. X
% D' F* y5 i) ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 14:35 , Processed in 0.039810 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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