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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . b8 X7 U  G6 M) E. q5 e  r

4 s4 ~5 a7 p5 W, d0 I) tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) ^/ d% S0 T6 F. q7 p' a4 c
#include <unistd.h>
, X4 l% L3 W! Y/ G#include <sys/mman.h>
: _  Z( M1 N3 p#include <sys/types.h>. m3 B  G2 K! J/ \4 g- t7 P
#include <fcntl.h>4 T' I- w1 u( y& t
& r1 d$ C+ P8 o6 j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # h* E: t6 N+ w; C% d, e5 m
& z; t! m3 F3 y; I, j
typedef struct9 U; a2 e) W% P1 ^, ]+ A3 t* @
{6 E& j" X, s5 O+ e; P& N' h
        unsigned int a;% ?9 u1 d7 b% k0 V
        unsigned int b;6 t1 a( P, S0 H% B" M
        unsigned int packet_cout;: P! K' x* W6 _, l5 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ?6 u- i+ Z' \" [6 x7 B
/ y) `4 Y( x) }6 m4 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 A  v- W# m/ p9 i+ @9 O* X$ bunsigned int count_copy = 0;3 s6 O* E0 f9 W5 I, n, H/ _  \

1 E- ^/ L2 W, ?, C- z7 P! v" Y8 b
) t. M8 t* ^+ a4 C* n9 ^int main()
4 E- [; V3 ?% q8 @8 f0 L3 h( I{
7 h4 m- J; D" p        pRX_MSG_PROTOCOL pshreRAM = NULL;
  ^$ g; N% y+ ?        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 I4 e' r2 a6 A4 M( p4 g2 `$ S# O+ J5 w: ~
        while(1)
* G4 A* q+ v6 D        {, W1 P- c* z5 F1 ~0 [
                read_MSG_buffer(pshreRAM);
5 Z" y- n% W, b: r        }               
' p# a3 K8 Z# x6 E}, e  H; v/ E; F+ P! W

0 D7 R; `  O' F5 p& L* E. Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" ]4 `) W3 @/ o4 ~{1 W; W4 s3 X" c" N7 ]2 X8 V) Y
        RX_MSG_PROTOCOL buf;
0 i; v3 q% B7 ]* V1 G& Y        
2 _5 M# S6 e6 p        buf.a = pshreRAM->a;( ^1 ]5 Q$ {+ ?  ]3 \  y9 P
        buf.b = pshreRAM->b;& W+ P: T2 B" c0 X. s9 s1 `  n
        buf.packet_cout = pshreRAM->packet_cout;  Z6 ?" W- w; C
        3 \1 x0 n& R0 `, i
        if(buf.packet_cout != count_copy)
; R* [7 i' w3 I! f, ?6 G        {
2 d: z. X/ C( h! ?$ L; U                printf("a is %d\n", buf.a);
1 U8 W2 h5 Z! ^+ G                printf("b is %d\n", buf.b);
3 v: {1 ~  [8 A7 [                printf("count is %d\n", buf.packet_cout);
2 b9 s2 B: H& _4 p8 m( s( P* V& r4 [                count_copy = buf.packet_cout;
* Q" n8 h5 {( E  }- z) `+ K3 y+ X        }
, l/ {" L0 i8 D        else
. I8 i1 B$ A! ]* y/ Q$ k0 E        {
& z! h' z- X- a5 e" T7 i                printf("No effective message!");6 Q2 T" K' o7 o7 j' A
        }8 y  }# o- T3 Z! @! T0 v, ^
}" Q' a+ h7 U& p% a" E5 u
7 B0 d6 |5 K6 T" M

, f" f- @1 X2 n- X8 q! k/ c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ Q" s! X4 f4 O使用下面代码,对内存使用了mmap函数后:! y+ l$ {# Q6 }; Y' y4 G  Y
#include <stdio.h>+ g& N) E: \# D7 M% G( R
#include <unistd.h>: h. N! |% H/ g( F8 `
#include <sys/mman.h>
, X, z" o" j/ W" j#include <sys/types.h>) _9 _' ~5 ~* {
#include <fcntl.h>5 |/ b: E- t  a) [
8 A& V9 i, K9 T" o* p0 F& y
#define SHAER_RAM_BASE_ADDR    (0x80000000)" q/ ?+ T5 L4 Y6 Z; q
#define SHAER_RAM_SIZE         (0x20000)   4 R" d+ q0 Y) w$ o( [& `; L

0 m- Z4 e4 a! Ztypedef struct
0 m# x' V+ k, k{# G% G0 v4 w9 \9 u. g. Q" b1 S9 u
        unsigned int a;' w0 v5 H4 a- D; d  ?7 j
        unsigned int b;. u$ a) k' F# H) u6 d
        unsigned int packet_cout;
3 [( E7 G4 n  J5 W/ h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ]5 ]* S3 q" z! w) d% o# H# e0 C, f, J9 ^' S
void read_MSG_buffer(int *baseaddr);
) F- X# l9 t7 Vunsigned int count_copy = 0;5 M8 m% T8 u3 `' P# j5 o
7 X! `+ L& a' v" }& u
int main()
8 d# i# E$ V0 M* Q4 T/ r{" c/ i; d, x( ~: `+ Q9 F) ?' d
        int fd;
# j0 z% [9 M* x# [7 v$ a" ^4 M5 Z) W        int *mem = NULL;
6 U* d6 X9 w& [1 b. h3 o  A
. {/ b& r! `' |( _0 p1 j7 }& u        if((fd = open("/dev/mem", O_RDWR)) <0). K9 h5 H0 P8 ^; U) t% s* I
        {
( K# f( L8 n8 k' C) ?3 b                perror("open error");
8 B- v9 W+ N  J8 y, ?3 e                return -1;
* y$ i2 _; i1 t# p6 [. _" n        }
, y& t2 `6 a7 r( ^. Z) d        
0 L. P2 b1 I: Q/ }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 ~2 f4 ~% r( S: }2 \- X
( I; r. j' ~9 I4 K5 K* l' x
        while(1)- F' Y* V& }2 f( H/ A* n* a3 ?
        {7 W2 W  {/ d5 q7 o  c: v! H! Z
                read_MSG_buffer(mem);
" p" y9 X  R* q        }               
* t& q) `$ F) j$ h3 A$ H( i}
# F' {' r& v2 z" ~
) F; @: q$ J6 lvoid read_MSG_buffer(int *baseaddr)
, C+ ]( |4 s2 L# v{
5 D4 }0 T1 y# D! A        pRX_MSG_PROTOCOL pshreRAM = NULL;
; }* @$ F. G( L2 k! o: g2 y" }! _+ v/ |* ]5 h( {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% Z) l. p9 A6 E+ r
" ~8 h% W! n9 j* h4 z
        if(pshreRAM->packet_cout != count_copy)$ V0 ~; ]5 K% d# `$ S0 {
        {8 I1 u* B7 t( f- w+ ]' Y
                printf("a is %d\n", pshreRAM->a);- ~6 v( d+ _# I# J4 I8 ^7 r
                printf("b is %d\n", pshreRAM->b);9 c8 c; z+ X9 i+ S" F/ T3 Y
                printf("count is %d\n", pshreRAM->packet_cout);5 m# B$ a5 i% e
                count_copy = pshreRAM->packet_cout;
2 U6 C, q& [* r# M' |, P- c        }
5 v1 Z/ z% S0 c5 v$ H& M        else1 B( B. E8 I9 c1 M/ Q; F: x
        {
1 G& q- |# q& s5 F+ L( N                printf("No effective message!\n");
3 n! H' _" {- ^; F6 P* l        }
% h/ ^1 K! \0 Q' w" g3 m- R8 O$ V# P}
: g3 ?9 R; F8 [4 }' m
8 W. V! P8 {8 \" n- i0 e8 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& P: I1 E: g! t
8 U$ u/ X2 K; a
3 Z- t+ M8 K# j0 d7 S

8 B5 L/ z3 N- n; d# ~- w8 u% D1 ]* q; Z; e5 o0 `- b+ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 10:08 , Processed in 0.040607 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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